如何将计时器中的数据传递给新的 ViewController (Swift 3)

Posted

技术标签:

【中文标题】如何将计时器中的数据传递给新的 ViewController (Swift 3)【英文标题】:How do I pass data in timer to new ViewController (Swift 3) 【发布时间】:2017-06-12 21:55:20 【问题描述】:

我知道如何将数据传递给新的 ViewController。问题是我似乎无法从计时器内传递数据。

以下代码适用于一个 ViewController。我尝试了多种将代码拆分为两个视图控制器的方法。我尝试将计时器放在 SecondViewController 中。我尝试只传递初始 datePicker。我试过把函数放在函数里面。

当前的问题是我无法通过 totalSeconds,因为它是在计时器中定义的。如果我在计时器之外初始化函数,比如在 0 处,它只会返回一个值 0。如果我传递 datePicker 或日期组件,当我在 SecondViewController 中定义时间间隔时会遇到类似的问题。例如,updateTimer 函数将无法识别传递给 SecondViewController 的 ViewDidLoad() 的值。

非常感谢任何帮助。我只是想将字符串放在 SecondViewController 中的 updateTimer() 中。

    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

【问题讨论】:

【参考方案1】:
@CJW ,

您是否了解协议和委托概念。 您可以使用委托和协议轻松解决上述问题。

1.在你的第一个视图控制器类中创建一个协议

protocol TimerUpdateDelegate 
    func updateTotalSeconds(_ iTotalSeconds : Int)

2.为委托创建变量

var delegate : TimerUpdateDelegate?

3.现在在第一个视图控制器的updateTimer 方法中添加以下代码行。

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

在上面的代码行中,totalSeconds 将是您在 self updateTimer 函数中作为参数计算的值。

4.现在在您的第二个视图控制器类中导入委托,

         class ViewController: UIViewController,TimerUpdateDelegate 

5.在 ViewDidload 方法中添加以下行:

override func viewDidLoad() 
  firstViewController.delegate = self
  

6.在您的第二类视图控制器中定义 TimerUpdateDelegate 方法:

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

我希望这能解决您的问题。

【讨论】:

非常感谢。会尝试。刚接触编程和 ios,所以我还没有听说过协议和委托。

以上是关于如何将计时器中的数据传递给新的 ViewController (Swift 3)的主要内容,如果未能解决你的问题,请参考以下文章

如何将视图控制器中的数据传递给另一个视图控制器中的集合视图? [复制]

在应用程序完成获取并将获取的数据传递给它之后,我应该如何启动一个新的 Activity?

如何将表单 FormSeetController 中的数据传递给 ViewController?

如何将片段中的 ListView 对象的数据传递给 Activity?

如何将解析器中的数据传递给函数

当我的应用程序通过我的 UITabBar 完成启动时,如何将加载的数据传递给 UITableView?