나는 약 일주일 전에이 질문의 일부를 물었고 투표를해서 그것을 해결하기 위해 시간을 보냈다. UIPicker와 함수 사이를 전달하는 첫 번째 부분을 수행하는 방법을 알아 냈습니다. 저는 computeTime () 클래스를 만들었고 그 안에는 배열을 매개 변수로 받아들이는 함수가 있습니다. 그런 다음 내가 계산하는 숫자를 계산합니다. 다음에해야 할 일은 카운트 다운 타이머로 텍스트 레이블을 업데이트 할 수 있도록 update () 함수에 카운트를 전달하는 것입니다. 이 기능을 어디에 두어도 작동하지 않습니다. 클래스 내부에 있으면 선택기 오류가 발생합니다. 클래스 외부에 있으면 카운트 값을 얻을 수 없습니다. 코드 상단에 설정 한 값으로 재정의됩니다. 여기에 모든 코드를 붙여 넣습니다. 누군가 나를 도울 수 있기를 바랍니다.
import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
@IBOutlet weak var dep: UITextField!
@IBOutlet weak var picker: UIPickerView!
@IBOutlet weak var arrivesAt: UIButton!
@IBOutlet weak var departsFrom: UIButton!
@IBOutlet weak var arr: UITextField!
@IBOutlet weak var countDownLabel: UILabel!
var pickerData: [[String]] = [[String]]()
var timer: NSTimer!
var count = 2
var arrayTimes = [""]
override func viewDidLoad() {
super.viewDidLoad()
calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])
picker.hidden = true
dep.delegate = self
dep.resignFirstResponder()
arr.resignFirstResponder()
//Picker
// Connect data:
self.picker.delegate = self
self.picker.dataSource = self
// Input data into the Array:
pickerData = [["larkspur", "saulsalito", "san francisco", "fisherman's wharf", "giants stadium", "tiburon", "vallejo", "alameda", "harbor bay", "jack london", "south s.f."],
["san francisco", "saulsalito", "larkspur", "fisherman's wharf", "giants stadium", "tiburon", "vallejo", "alameda", "harbor bay", "jack london", "south s.f."]]
}
//Mark - Location Delegate Methods
struct MyViewState {
static var count = 8
}
class calculateTime {
var timesArray:[String] = []
var timer: NSTimer!
var count: Int = 0
func refreshView(array: [String]) {
let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Hour, .Minute], fromDate: date)
let hour = components.hour
let minutes = components.minute
let currentTime = "\(hour)" + ":" + "\(minutes)"
self.timesArray = array
print(timesArray)
// create a method to convert your time to minutes
func stringToMinutes(input:String) -> Int {
let components = input.componentsSeparatedByString(":")
let hour = Int((components.first ?? "0")) ?? 0
let minute = Int((components.last ?? "0")) ?? 0
return hour*60 + minute
}
//create an array with the minutes from the original array
let timesMinutesArray:[Int] = timesArray.map { stringToMinutes($0) }
let dayMinute = stringToMinutes(currentTime)
// filter out the times that has already passed
let filteredTimesArray = timesMinutesArray.filter{$0 > dayMinute }
// get the first time in your array
if let firstTime = filteredTimesArray.first {
// find its position and extract it from the original array
let nextDeparture = timesArray[timesMinutesArray.indexOf(firstTime)!] // "15:40"
let userCalendar = NSCalendar.currentCalendar()
let dateMakerFormatter = NSDateFormatter()
dateMakerFormatter.calendar = userCalendar
dateMakerFormatter.dateFormat = "yyyy/MM/dd"
// How many hours and minutes between now and the next ferry
dateMakerFormatter.dateFormat = "H:mm"
let startTime = dateMakerFormatter.dateFromString(currentTime)!
let endTime = dateMakerFormatter.dateFromString(nextDeparture)!
let hourMinuteComponents: NSCalendarUnit = [.Hour, .Minute]
let timeDifference = userCalendar.components(
hourMinuteComponents,
fromDate: startTime,
toDate: endTime,
options: [])
let difference = (timeDifference.hour*60) + (timeDifference.minute)
var count = difference
print(count) //this returns correctly
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: ViewController(), selector: "update", userInfo: nil, repeats: true)
}
}
}
//Picker
// The number of columns of data
func numberOfComponentsInPickerView(picker: UIPickerView) -> Int {
return 2
}
// The number of rows of data
func pickerView(picker: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return pickerData[component].count
}
// The data to return for the row and component (column) that's being passed in
func pickerView(picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return pickerData[component][row]
}
//Show picker wen text field is click in
func textFieldShouldBeginEditing(textfield: UITextField) -> Bool {
dep.resignFirstResponder()
arr.resignFirstResponder()
self.dep.tintColor = UIColor.clearColor()
self.arr.tintColor = UIColor.clearColor()
picker.hidden = false
return false
}
//Make text uneditable
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return false
}
// Catpure the picker view selection
func pickerView(picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
// This method is triggered whenever the user makes a change to the picker selection.
// The parameter named row and component represents what was selected.
print("/[component][row]")
let fromto = pickerData[component][row]
print(fromto)
if component == 0 {
var count = calculateTime().count
arr.text = "san francisco"
dep.text = pickerData[component][row]
calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])
print("help")
self.countDownLabel.text = "\(count)"
print(count)
}
else {
dep.text = pickerData[component][row]
}
picker.hidden = true;
}
func pickerView(picker: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView
{
var pickerLabel = UILabel()
pickerLabel.textColor = UIColor( red: CGFloat(41/255.0), green: CGFloat(100/255.0), blue: CGFloat(226/255.0), alpha: CGFloat(1.0) )
pickerLabel.text = pickerData[component][row]
// pickerLabel.font = UIFont(name: pickerLabel.font.fontName, size: 15)
pickerLabel.font = UIFont(name: "Helvetica Neue", size: 20) // In this use your custom font
pickerLabel.textAlignment = NSTextAlignment.Center
return pickerLabel
}
func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return 36.0
}
func update() {
if count == 1{
//self.minutes.text = "minute"
print("did change")
}
if(count > 0)
{
//countDownLabel.text = String(count--)
print(count)
}
else if (count == 0)
{
timer.invalidate()
print("ended")
calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])
}
}
}
모든 함수가 파일 내에서 액세스 할 수 있도록 파일 맨 위에 count 변수를 추가해야합니다. 이렇게하면 count 인스턴스가 하나만 있고 전체 파일 내에서 어디에서나 업데이트 할 수 있습니다. 즉 파일 맨 위에 :
var count : Int = calculateTime().count
그런 다음 내 에서처럼 카운트에 액세스 할 수 있습니다.
update()
함수.
별도의 클래스에있는 경우 해당 클래스의 인스턴스를 만들거나 해당 클래스의 인스턴스를 이미 전달해야합니다. 예를 들어, 클래스 A에서 count가 초기화 된 경우 :
public class A {
var count : Int = 0
}
그런 다음 클래스 B의 변수에 액세스하려면 다음과 같이 할 수 있습니다.
public class B {
var classA : A = A()
print("Count : \(classA.count)")
}
이렇게하면 생성 한 A 인스턴스의 개수에 액세스 할 수 있습니다. 또는 클래스 B의 인스턴스를 만들 때 초기화 할 때 클래스 A의 적절한 인스턴스를 전달할 수 있습니다. 예를 들면
public class C {
var a : A = A()
var b : B = B(class : a)
}
public class B {
var count : Int
init(class : A = A()) {
count = class.count
}
}
또한 OOP에서는 개수를 노출하고 개수를 비공개로 설정하는 대신 getter와 setter를 사용하고 싶을 것입니다. 즉
public class A {
private var _count = 0
var count : Int {
get {
return _count
}
set {
if newValue != _count {
_count = newValue
}
}
}
}
public class B {
var classA : A = A()
classA.count = 2 // Would set the count of class A, for the particular instance you have created as 2
}
이것은 또한 변수에 대한 액세스를 제공합니다. 또한 이것이 도움이되지 않는 경우 델리게이트 및 프로토콜을 살펴보고 이러한 방식으로 변수를 전달할 수도 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다