如何将时间从一个视图控制器转移到另一个视图控制器?

时间:2017-11-14 20:08:11

标签: swift

在我目前的项目中,我在一个视图上实现了一个计时器。 当我点击导致下一个视图的按钮时,我希望它显示上一个视图最后的时间。

这是我目前的代码:

import UIKit

class ViewController2: UIViewController, UITableViewDataSource, UITableViewDelegate {


@IBOutlet weak var myTableView: UITableView!

@IBOutlet weak var labelMinute: UILabel!
@IBOutlet weak var labelHour: UILabel!
@IBOutlet weak var labelSecond: UILabel!

weak var timer: Timer?
var startTime: Double = 0
var time: Double = 0
var elapsed: Double = 0
var status: Bool = false

var psgTextField: UITextField?
var emTextField: UITextField?


public var passengers2 = [""]

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return passengers2.count
}


public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell2 = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell2")
    cell2.textLabel?.text = passengers2[indexPath.row]

    return (cell2)
}

@objc func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath){

    if editingStyle == UITableViewCellEditingStyle.delete {

        let alertController = UIAlertController(title: "Do you really want to leave?",
                                                message: nil,
                                                preferredStyle: .alert)


        alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

        alertController.addAction(UIAlertAction(title: "Leave", style: .default, handler: { action in self.passengers2.remove(at: indexPath.row)
            self.myTableView.deleteRows(at: [indexPath], with: .automatic)
        } ))

        self.present(alertController, animated: true)


    }
}



override func viewDidLoad() {
    super.viewDidLoad()

    startTime = Date().timeIntervalSinceReferenceDate - elapsed
    timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(updateCounter), userInfo: nil, repeats: true)

    status = true

}

@objc func updateCounter() {

    // Calculate total time since timer started in seconds
    time = Date().timeIntervalSinceReferenceDate - startTime

    // Calculate minutes
    let minutes = UInt8(time / 60.0)
    time -= (TimeInterval(minutes) * 60)

    // Calculate seconds
    let hours = UInt8(time / 3600)
    time -= TimeInterval(hours)

    let seconds = UInt8(time)
    time -= TimeInterval(seconds)

    // Format time vars with leading zero
    let strMinutes = String(format: "%02d", minutes)
    let strHour = String(format: "%02d", hours)
    let strSecond = String(format: "%02d", seconds)

    // Add time vars to relevant labels
    labelMinute.text = strMinutes
    labelHour.text = strHour
    labelSecond.text = strSecond

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let thirdController = segue.destination as! ViewController3
    thirdController.timeHour.text = labelHour.text

    let fourthController = segue.destination as! ViewController3
    fourthController.timeMinute.text = labelMinute.text
}
}

没有最后一个“覆盖”功能,我的第一个视图上的计时器工作正常,但由于某种原因,它不会将时间转移到第二个视图上的标签(“timeHour”,“timeMinute”)。

Xcode给了我错误Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0),但我在互联网上找到的案例与我的不同。

有人知道问题出在哪里吗?

3 个答案:

答案 0 :(得分:2)

首先(这不是真正的问题,但无论如何我都要说),你的代码充满惊叹号。其中任何一个都可能导致崩溃。不要使用感叹号! (就像那个。)你的labelHour可能是nil。您的labelMinute可能是nil。您的segue目标可能不是ViewController3。所有这些代码都非常危险!你需要安全地检查所有这些东西,而不是使用感叹号。

然而,真正的问题是这一行:

thirdController.timeHour.text = // ...

您的thirdController尚未加载其视图,因此它还没有timeHour标签。

你的时间安排完全正常。但更糟糕的是,这条线的整体精神是错误的;您必须从不干扰另一个视图控制器的界面。您需要在ViewController3中设置属性,ViewController3可以在其viewDidLoad中获取这些值并配置自己的接口

答案 1 :(得分:1)

这是我的想法: 1.你是否正确设置了你的segue? 2.使用segue传递数据,要求您传递数据并在视图事件中正确处理。

一些示例代码可能如下所示:

var passedData: String!;

func viewDidLoad() {
    self.txtName.text = passedData;
}

在接收视图控制器时,请在viewDidLoad函数上处理它,例如

printf("mode:%d\n",S_IRWXU);

答案 2 :(得分:0)

我的猜测是,当您尝试访问目的地视图控制器中的插座时,它们尚未连接。尝试添加以下代码:

thirdController.loadViewIfNeeded()

在您现有的代码行下面:

let thirdController = segue.destination as! ViewController3