如何在两个视图控制器Swift中更新tableView上的数据和同步计时器



我正在制作一个计时器应用程序。我有两个视图控制器,其中一个有计时器(第二个视图控制器(,如下所示

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()

}

}

我有以下问题,我需要的帮助

  1. 当minutesDone(或者更确切地说是minutesDone1(被传回时,它会在每个单元格上更新。我如何让它在我需要的特定indexPath.row上更新
  2. 我希望minutesDone1在TreatmentTimeViewController中持续更新。我需要设置另一个计时器吗?或者有没有办法在两个视图控制器中同步计时器?如果是这样,最好的方法是什么
  3. 最后一个问题是,当我单击单元格转到SessionTimerViewController,即didSelectRowAt时,它总是再次启动计时器。我该如何设置一个条件,即如果它已经在运行,它应该继续运行?提前谢谢
  1. 使用表视图的更新行方法。

  2. 使用观察器-接收器模式来实现此功能。

  3. 将以前的时间条件本地保存为用户默认值,并创建一个全局布尔变量(通常使用singleton类(来限制条件。

最新更新