将.scheduledTimer的变量返回到Swift 3中的TableView单元

时间:2017-01-25 06:59:56

标签: ios swift uitableview swift3

我有一个tableView,每个单元格都有一个计时器,在调用tableView:didSelectRowAtIndexPath时运行。我尝试在自定义单元格(cellName)中使用标签(CustomCell)来显示计时器递增。我在#selector中使用.scheduledTimer来调用名为getTimer()的单独函数来增加值。代码如下所示。

我已将此代码缩写为仅显示相关信息

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var time = 0


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let cell: CustomCell = tableView.cellForRow(at: indexPath)! as!
    CustomCell

        var timer = Timer()

        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.getTimer), userInfo:nil, repeats: true)

        cell.cellName.text = String(self.getTimer())


    }

    func getTimer() -> String {

        time += 1
        return String(time)
    }
}

两件事:

  1. 我的time变量是在类级别定义的,因此getTimer()可以在每次.scheduledTimer刷新时增加此值。我想在:didSelectRowAtIndexPath中定义它,以便我可以同时运行多个计时器。有没有一种方法可以在:didSelectRowAtIndexPath中定义,也可以通过从getTimer()返回增量来获得结果?

  2. 目前,我正在使用cellName返回的字符串更新getTimer。这是静态的,目前正在考虑在.scheduledTimer刷新时我可以刷新它的方法。我应该将indexPath.row传递给getTimer并在getTimer()函数本身更新吗?

1 个答案:

答案 0 :(得分:0)

你对问题的逻辑是不对的。我会给你一个快速解决问题的方法。在类范围

中创建两个变量timeArraytimerArray
var timeArray = [Int]()
var timerArray = [Timer]()

将此代码放入viewDidLoad。创建数组时,将计数1替换为tableview中的单元格数。

    timeArray = Array(repeating: 0, count: 1)
    let timer = Timer(timeInterval: 1, target: self, selector: #selector(self.timerFired(_:)), userInfo: nil, repeats: true)
    timerArray = Array(repeating: timer, count: 1)

didSelectRow tableview委托方法中处理计时器验证和失效

    if timerArray[indexPath.row].isValid{
        timerArray[indexPath.row].invalidate()
    }
    else{
        timerArray[indexPath.row] = Timer(timeInterval: 1, target: self, selector: #selector(self.timerFired(_:)), userInfo: indexPath.row, repeats: true)
        timerArray[indexPath.row].fire()
    }

添加此函数将在触发计时器时触发。

func timerFired(_ timer:Timer){
    if let index = timer.userInfo as? Int{
        timeArray[index] += 1
    }
}

最后,在你的cellForRow tableview的数据源方法中设置标签文本

cell.cellName.text = time[indexPath.row]

不要忘记在timerFired功能时重新加载特定单元格。