2017-06-12 4 views
0

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 
} 

Antwort

0
@CJW , 

Sind Sie der Protokolle & Delegierten Konzept bewusst. Sie können das obige Problem leicht beheben, indem Sie die Delegaten & Protokolle verwenden.

1.Erstellen ein Protokoll in Ihrer ersten Viewcontroller Klasse als

protocol TimerUpdateDelegate { 
    func updateTotalSeconds(_ iTotalSeconds : Int) 
} 

2.Create Variable für die Delegierten als

var delegate : TimerUpdateDelegate? 

3.Now unterhalb der Linie hinzufügen Code in Ihrer updateTimer Methode des ersten View-Controllers.

 if self.delegate != nil 
     {self.delegate?.updateTotalSeconds(totalSeconds)} 

in über Codezeile, die totalSeconds Ihr berechneten Wert in Selbst updateTimer Funktion als Parameter sein wird.

4.Now Import Delegat in Ihrer zweiten Viewcontroller Klasse,

  class ViewController: UIViewController,TimerUpdateDelegate {} 

5.In viewDidLoad Methode unten Satz Zeilen hinzu:

override func viewDidLoad() { 
    firstViewController.delegate = self 
    } 

6.Define TimerUpdateDelegate Methoden in der zweiten Klasse View-Controller:

func updateTotalSeconds(_ iTotalSeconds : Int) 
      { 
       self.finalSeconds = iTotalSeconds 
      } 

Ich hoffe, dass dies Ihr Problem beheben wird.

+0

Vielen Dank. Werde versuchen. Neu in Programmierung und iOS, also habe ich noch nichts von Protokollen und Delegaten gehört. – CJW

Verwandte Themen