我正在制作一个计时器应用程序。我有两个视图控制器,其中一个有计时器(第二个视图控制器(,如下所示
protocol PassBack {
func passBackData(minutesDone: Int)
}
class SessionTimerViewController: UIViewController {
var delegate: PassBack?
var timeLeft = 10
var totalTT = ""
var timer = Timer()
var minutesDone = 0
override func viewDidLoad() {
super.viewDidLoad()
timeAllocated.text = "(totalTT) minutes"
timeLeft = Int(totalTT)! * 60
let hours = timeLeft / 3600
let minutes = timeLeft / 60 % 60
let seconds = timeLeft % 60
remainingTime.text = String(format:"%02i:%02i:%02i", hours, minutes, seconds)
}
override func viewWillDisappear(_ animated: Bool) {
delegate?.passBackData(minutesDone: minutesDone)
dismiss(animated: true, completion: nil)
self.navigationController?.popViewController(animated: true)
}
func toggleTimer(on: Bool) {
if on {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {
timer in
self.timeLeft -= 1
self.minutesDone = (Int(self.totalTT)! * 60) - self.timeLeft
let hours = self.timeLeft / 3600
let minutes = self.timeLeft / 60 % 60
let seconds = self.timeLeft % 60
self.remainingTime.text = String(format:"%02i:%02i:%02i", hours, minutes, seconds)
if self.timeLeft == 0 {
timer.invalidate()
}
} else {
timer.invalidate()
}
}
}
我已经成功地将minutesDone传递回第一个视图控制器。第一个视图控制器中的代码如下。
class TreatmentTimeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var nameTime = [NameTime]()
var treatmentTime1 = 10
var statusUpdate1 = "Not treated"
var minutesDone1 = 0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TreatmentTimeCell", for: indexPath) as? TreatmentTimeTableViewCell
cell?.patientName?.text = nameTime[indexPath.row].patientName
cell?.treatmentTime?.text = "(nameTime[indexPath.row].treatmentTime)"
let value = nameTime[indexPath.row].treatmentTime
var value2 = nameTime[indexPath.row].minutesDone
value2 = minutesDone1
if value2 == value {
statusUpdate1 = "Treatment completed"
} else if value2 == 0 {
statusUpdate1 = "Not treated"
} else if value2 < value {
statusUpdate1 = "Currently treating"
}
cell?.minutesDone?.text = "(value2)"
cell?.statusUpdate?.text = statusUpdate1
return cell!
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let destinationVC = storyboard.instantiateViewController(withIdentifier: "SessionTimerViewController") as? SessionTimerViewController
tableView.deselectRow(at: indexPath, animated: true)
let value = nameTime[indexPath.row].treatmentTime
treatmentTime1 = value
destinationVC?.totalTT = "(treatmentTime1)"
destinationVC?.delegate = self
self.navigationController?.pushViewController(destinationVC!, animated: true)
}
extension TreatmentTimeViewController: PassBack {
func passBackData(minutesDone: Int) {
minutesDone1 = minutesDone / 60 % 60
tableView.reloadData()
}
}
我有以下问题,我需要的帮助
- 当minutesDone(或者更确切地说是minutesDone1(被传回时,它会在每个单元格上更新。我如何让它在我需要的特定indexPath.row上更新
- 我希望minutesDone1在
TreatmentTimeViewController
中持续更新。我需要设置另一个计时器吗?或者有没有办法在两个视图控制器中同步计时器?如果是这样,最好的方法是什么 - 最后一个问题是,当我单击单元格转到
SessionTimerViewController
,即didSelectRowAt
时,它总是再次启动计时器。我该如何设置一个条件,即如果它已经在运行,它应该继续运行?提前谢谢
-
使用表视图的更新行方法。
-
使用观察器-接收器模式来实现此功能。
-
将以前的时间条件本地保存为用户默认值,并创建一个全局布尔变量(通常使用singleton类(来限制条件。