Tableview Swift 中的多个计时器

Posted

技术标签:

【中文标题】Tableview Swift 中的多个计时器【英文标题】:Multiple Timers in Tableview Swift 【发布时间】:2019-06-05 15:22:47 【问题描述】:

我正在尝试为每一行设置计时器,当用户单击添加按钮时手动添加该计时器。

开始时间设置为 100 个单位(对问题不重要),它应该倒计时。

添加新行时,它会启动自己的计时器并在新行上显示值。

我尝试在每个单元格中设置计时器,但这会在出队时产生问题,因此我创建了计时器数组来为每个单元格保存相应的计时器。我现在面临的问题是如何每秒更新单元格值(计时器间隔)

MultipleTimersTableView_Gist 是我目前编写的代码的链接。我想过使用委托来更新单元格,但不确定最好的方法。

任何帮助将不胜感激。

编辑:

计时器应该以递增的顺序显示时间,因为每一行(连同计时器)都是从上到下创建的,这意味着第一个将比下一个具有更少的时间。看起来像在出队时搞砸了。

Here 是我在上面截图中使用的要点

【问题讨论】:

您在出列时遇到了什么问题? 见this 【参考方案1】:

以下是您如何处理每个UITableViewCell 中的timers

创建自定义UITableViewCell

class CustomCell: UITableViewCell 
    //MARK: Outlets
    @IBOutlet weak var label: UILabel!

    //MARK: Internal Properties
    var handler: ((Int)->())?

    //MARK: Private Properties
    private var timer: Timer?
    private var counter = 100 
        didSet 
            DispatchQueue.main.async 
                self.label.text = "\(self.counter)"
                self.handler?(self.counter)
            
        
    

    //MARK: Internal Methods
    func configure(with counter: Int) 
        self.counter = counter
        self.setTimer()
    

    //MARK: Private Methods
    private func setTimer() 
        self.timer?.invalidate()
        self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: [weak self] (timer) in
            if let counter = self?.counter, counter > 0 
                self?.counter -= 1
             else 
                timer.invalidate()
            
        )
    

在上面的代码中,

    我创建了一个label,它将更新UI 中的counter 值。 handler - 当cell 移出屏幕时,它会将更新后的counter 值存储在某处(在ViewController 中,进一步解释) timer - 在cell 中安排timertimeinterval = 1 counter - 每个cell 的当前counter

ViewController

class VC: UIViewController, UITableViewDataSource 
    let numberOfCells = 20
    var timerArr = [Int]()

    override func viewDidLoad() 
        super.viewDidLoad()
        self.timerArr = [Int](repeating: 100, count: numberOfCells)
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return self.numberOfCells
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
        cell.configure(with: self.timerArr[indexPath.row])
        cell.handler = [weak self] (counter) in
            self?.timerArr[indexPath.row] = counter
        
        return cell
    

在上面的代码中,

    timerArr - 跟踪 tableView 中每个 cellcounter 值。 在tableView(_:cellForRowAt:) 中,每个cellcounter 使用我们之前在CustomCell 中创建的handler 进行更新。

【讨论】:

我尝试使用您的代码,但仍然存在出列行的问题。使用您提到的代码后,请检查我更新的问题并附上问题的屏幕截图。【参考方案2】:

我会为所有单元格使用一个计时器。创建对象并将其添加到数据源时,记录 dateAdded = Date(),然后在计时器触发时重建单元格时,从 dateAdded 字段中获取每个单元格的秒数并更新 cellForRowAtIndex 中的单元格。

【讨论】:

以上是关于Tableview Swift 中的多个计时器的主要内容,如果未能解决你的问题,请参考以下文章

如何将计时器中的数据传递给新的 ViewController (Swift 3)

在 Swift 中更改计时器选择器函数中的 userInfo

无法让我在 Swift 中的计时器在 Playground 中触发

swift iOS / OSX / Swift中的精确计时

Vapor 3 Swift 4 如何制作计时器

如何使用倒数计时器停止游戏 - iOS [SWIFT] -