2017-06-12 30 views
0

新しいViewControllerにデータを渡す方法は分かっています。問題は、タイマーの中からデータを渡すことができないことです。タイマーのデータを新しいViewController(Swift 3)に渡す方法

次のコードは1つのViewControllerで機能します。私は2つのビューコントローラにコードを分割する複数の方法を試みました。 SecondViewControllerにタイマーを配置しようとしました。私は最初のdatePickerを渡してみました。関数の中に関数を配置しようとしました。

タイマー内で定義されているため、totalSecondsを渡すことができないという問題があります。私がdatePickerまたは日付コンポーネントを渡すと、SecondViewController内の時間間隔を定義するときに同様の問題が発生します。たとえば、updateTimer関数は、SecondViewControllerのViewDidLoad()に渡された値を認識しません。

ご協力いただきまして誠にありがとうございます。私は単に、updateTimer()内の文字列を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 
} 

答えて

0
@CJW , 

あなたはプロトコル&委任概念を認識しています。 代理人の&プロトコルを使用して上記の問題を簡単に修正できます。

1.CreateあなたupdateTimerメソッドのコードの行の下に追加

var delegate : TimerUpdateDelegate? 

3.Nowとしてデリゲートのため

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

2.Create変数としてあなたの最初のViewControllerクラスのプロトコル最初のビューコントローラのtotalSecondsをパラメータとして自己updateTimer機能で、あなたの計算された値になることを上記のコード行で

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

。 2番目のViewControllerクラスで

4.Now輸入代理、

  class ViewController: UIViewController,TimerUpdateDelegate {} 

5.In viewDidLoadメソッドラインのセットの下に追加します。

override func viewDidLoad() { 
    firstViewController.delegate = self 
    } 
あなたの第二のクラスで

6.Define TimerUpdateDelegate方法ビューコントローラ:

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

これはあなたの問題を解決することを望みます。

+0

ありがとうございます。しようとします。プログラミングやiOSには触発されていないので、プロトコルやデリゲートについては聞いていません。 – CJW

関連する問題