在 UITableViewController 中处理多个计时器值?

Handling multiple timer values in a UITableViewController?

我不一定需要代码,但我希望能够非常具体地 steps/logic 如何处理我的问题。

我的初始视图控制器是 table 视图控制器。它将显示单个计时器值并在当前单元格中显示其倒计时。计时器值是从单独的常规视图控制器中检索的。此视图控制器包含一个 UIPicker,计时器值是使用用户从选取器中选择的值计算的。

我在处理 tableviewcontroller 中的多个计时器的逻辑上遇到了问题。每个新创建的单元格都应分配一个新的计时器对象,该对象是随着该单元格的创建而创建的。这样,特定的单元格使用通过特定的 UIPicker 值创建的时间值。到目前为止,我只能到达每个单元格使用与创建的第一个单元格相同的计时器值的位置。

我如何告诉位于初始 table 视图控制器中的新创建的单元格,它应该只使用由用户使用位于第二个视图控制器中的 UIPicker 选择的特定计时器值创建的值?如何分隔单元格之间的计时器值?

我认为您的问题是维护每一行数据的状态。由于 table 视图重用了单元格,所以它成为一个问题。 将定时器的状态保存在父视图控制器的数组中。 在每次调用 cellForRowAtIndex 时设置该值。

你永远不应该有一个具有逻辑实现的 table 视图单元格,所以最多,单元格的接口应该有一个名为 setTime 的方法,你给它一个 String 它只是将其分配给标签。

既然弄清楚了,谁来做逻辑?我相信您可以将计时器逻辑抽象到它们自己的对象中,因为 table 视图控制器要跟踪所有 play/pause 状态、已经过了多少时间等会很麻烦.

所以留给 table 视图控制器的工作只是从计时器对象中获取数据(剩余时间),将它们转换为 Strings(你可能在这里有格式化逻辑VC 应该处理)然后将这些字符串传递给单元格。

代码如下所示:

var timerObject = timerObjectArray[rowNumber]
var timeRemaining: Date = timerObject.getTimeRemaining()
var timeString: String = convertToString(timeRemaining)
cell.setTimeString(timeString)

所以现在我们尝试找出 when/how 来获取细胞。 至于什么时候,那是你的选择,我认为 NSTimer.scheduledTimerWithInterval 可以工作(注意保留周期)

现在,在传递给计划的方法中,每个周期 运行,您应该有这样的代码:

self.tableView.beginUpdates()
var visibleCells = self.tableView.visibleCells
for cell in visibleCells {
    var indexPath = self.tableView.indexPath(for: cell)
    var rowNumber = indexPath.row

    var timeRemainString = getTimeRemainingStringFor(row: rowNumber)
    cell.setTimeString(timeRemainString)
}
self.tableView.endUpdates()

希望对您有所帮助!我可能错过了什么所以问一下

请使用下面的 NSTimer 代替。

解决方案:1

int64_t delayInSeconds = gameInterval; // Your Game Interval as mentioned above by you

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

    // Update your label here. 

});

解决方案:2

NSTimer.scheduledTimerWithTimeInterval(1, 
                    target: NSBlockOperation(block: {...}), 
                    selector: #selector(NSOperation.main), 
                    userInfo: nil, 
                    repeats: true)