Ich weiß, wie Sie Daten an einen neuen ViewController übergeben. Das Problem ist, dass ich scheinbar keine Daten innerhalb eines Timers weitergeben kann.Wie gebe ich Daten im Timer an neue ViewController (Swift 3)
Der folgende Code funktioniert für einen ViewController. Ich habe mehrere Möglichkeiten ausprobiert, den Code in zwei View-Controller aufzuteilen. Ich habe versucht, den Timer im SecondViewController zu platzieren. Ich habe versucht, nur den ursprünglichen datePicker zu übergeben. Ich habe versucht, Funktionen innerhalb von Funktionen zu platzieren.
Das aktuelle Problem ist, dass ich totalSeconds nicht übergeben kann, weil es innerhalb des Timers definiert ist. Wenn ich die Funktion außerhalb des Timers initialisiere, sagen wir bei 0, gibt es einfach den Wert 0 zurück. Wenn ich den datePicker oder date-Komponenten übergebe, stoße ich auf ein ähnliches Problem, wenn ich die Zeitintervalle innerhalb des SecondViewControllers definiere. Zum Beispiel erkennt die updateTimer-Funktion die Werte nicht, die in ViewDidLoad() des SecondViewControllers übergeben werden.
Jede Hilfe wird sehr geschätzt. Ich möchte einfach die Zeichenfolgen in updateTimer() in einem SecondViewController platzieren.
class ViewController: UIViewController {
@IBOutlet weak var datePicker: UIDatePicker!
@IBOutlet weak var Output: UILabel!
@IBOutlet weak var Output4: UILabel!
@IBOutlet weak var Output3: UILabel!
@IBOutlet weak var Output2: UILabel!
@IBOutlet weak var timePicker: UIDatePicker!
@IBOutlet weak var Output5: UILabel!
@IBOutlet weak var Output6: UILabel!
var birthDate = DateComponents()
@IBAction func timePickerChanged(_ sender: Any) {
let tComponents = Calendar.current.dateComponents([.hour, .minute], from: (sender as AnyObject).date)
birthDate.hour = tComponents.hour
birthDate.minute = tComponents.minute
}
@IBAction func datePickerChanged(_ sender: Any) {
let components = Calendar.current.dateComponents([.year, .month, .day], from: (sender as AnyObject).date)
birthDate.year = components.year
birthDate.month = components.month
birthDate.day = components.day
}
override func viewDidLoad() {
super.viewDidLoad()
Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.updateTimer), userInfo: nil, repeats: true)
// Do any additional setup after loading the view, typically from a nib.
}
func updateTimer(){
let now = Date()
let birthDay = userCalendar.date(from: birthDate)!
let totalSeconds = Int(now.timeIntervalSince(birthDay))
let totalMinutes = userCalendar.dateComponents([.minute], from: birthDay, to: now)
let totalHours = userCalendar.dateComponents([.hour], from: birthDay, to: now)
let totalDays = userCalendar.dateComponents([.day], from: birthDay, to: now)
let totalWeeks = userCalendar.dateComponents([.weekOfYear],from: birthDay, to: now)
let totalMonths = userCalendar.dateComponents([.month], from: birthDay, to: now)
Output.text = String(totalSeconds)
if totalMinutes.minute != nil {
Output2.text = String(totalMinutes.minute!)
}
if totalHours.hour != nil {
Output3.text = String(totalHours.hour!)
}
if totalDays.day != nil{
Output4.text = String(totalDays.day!)
}
if totalWeeks.weekOfYear != nil{
Output5.text = String(totalWeeks.weekOfYear!)
}
if totalMonths.month != nil{
Output6.text = String(totalMonths.month!)
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
updateTimer()
let secondsController = segue.destination as! SecondViewController
secondsController.finalSeconds = totalSeconds
}
Vielen Dank. Werde versuchen. Neu in Programmierung und iOS, also habe ich noch nichts von Protokollen und Delegaten gehört. – CJW