2017-06-12 1 views
0

Je sais comment transmettre des données à un nouveau ViewController. Le problème est que je n'arrive pas à transmettre des données à partir d'une minuterie.Comment transmettre des données à un nouveau ViewController (Swift 3)

Le code suivant fonctionne pour un ViewController. J'ai essayé plusieurs façons de diviser le code en deux contrôleurs de vue. J'ai essayé de placer la minuterie dans le SecondViewController. J'ai essayé seulement en passant le datePicker initial. J'ai essayé de placer des fonctions à l'intérieur des fonctions.

Le problème actuel est que je ne peux pas transmettre totalSeconds car il est défini dans le temporisateur. Si j'initialise la fonction en dehors de la minuterie, disons à 0, elle renvoie simplement une valeur de 0. Si je passe les composants datePicker ou date, je rencontre un problème similaire lorsque je définis les intervalles de temps dans SecondViewController. Par exemple, la fonction updateTimer ne reconnaîtra pas les valeurs transmises dans ViewDidLoad() de SecondViewController.

Toute aide est grandement appréciée. Je veux simplement placer les chaînes dans updateTimer() dans un SecondViewController.

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 
} 

Répondre

0
@CJW , 

Connaissez-vous des protocoles & concept de délégué. Vous pouvez facilement résoudre le problème ci-dessus en utilisant les protocoles délégués &.

1.Créez un protocole dans votre première classe viewcontroller comme

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

variables 2.Créez pour délégué comme

var delegate : TimerUpdateDelegate? 

3.Now AJOUTZ ligne de code dans votre méthode updateTimer du premier contrôleur de vue.

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

en ligne au-dessus du code qui totalSeconds sera votre valeur calculée en fonction d'auto updateTimer en tant que paramètre.

délégué à l'importation de 4.Now dans votre deuxième classe viewcontroller que,

  class ViewController: UIViewController,TimerUpdateDelegate {} 

méthode 5.In viewDidLoad ajouter ci-dessous ensemble de la ligne:

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

méthodes 6.Define TimerUpdateDelegate dans votre deuxième classe contrôleur de vue:

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

J'espère que cela va résoudre votre problème.

+0

Merci beaucoup. J'essaierai. Nouveauté en programmation et iOS, je n'ai donc pas entendu parler de protocoles et de délégués. – CJW