首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更新tableView上的数据和同步2个视图控制器中的定时器

如何更新tableView上的数据和同步2个视图控制器中的定时器
EN

Stack Overflow用户
提问于 2020-07-30 03:32:53
回答 1查看 157关注 0票数 0

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

代码语言:javascript
复制
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传递回第一个视图控制器。第一个视图控制器中的代码如下所示。

代码语言:javascript
复制
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中不断更新。我是否需要设置另一个定时器,还是有一种方法来同步2视图控制器中的定时器?如果是这样的话,最好的方法是什么呢?
  3. 最后一个问题是,当我单击单元格到SessionTimerViewController,即在didSelectRowAt,它总是再次启动计时器。我该如何提出这样一个条件:如果它已经在运行,那么它应该在离开的地方继续运行?提前谢谢你。
EN

回答 1

Stack Overflow用户

发布于 2020-07-30 06:50:38

  1. 使用表视图的更新行方法.

  1. 使用观测器接收模式来实现此特性.

  1. 在默认情况下本地保存以前的时间条件,并创建一个全局布尔变量(通常使用单例类)来限制条件。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63165790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档