我有一个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)
}
}
两件事:
我的time
变量是在类级别定义的,因此getTimer()
可以在每次.scheduledTimer
刷新时增加此值。我想在:didSelectRowAtIndexPath
中定义它,以便我可以同时运行多个计时器。有没有一种方法可以在:didSelectRowAtIndexPath
中定义,也可以通过从getTimer()
返回增量来获得结果?
目前,我正在使用cellName
返回的字符串更新getTimer
。这是静态的,目前正在考虑在.scheduledTimer刷新时我可以刷新它的方法。我应该将indexPath.row
传递给getTimer
并在getTimer()
函数本身更新吗?
答案 0 :(得分:0)
你对问题的逻辑是不对的。我会给你一个快速解决问题的方法。在类范围
中创建两个变量timeArray
和timerArray
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
功能时重新加载特定单元格。