在我目前的项目中,我在一个视图上实现了一个计时器。 当我点击导致下一个视图的按钮时,我希望它显示上一个视图最后的时间。
这是我目前的代码:
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)
,但我在互联网上找到的案例与我的不同。
有人知道问题出在哪里吗?
答案 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