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

时间:2017-02-18 03:42:18

标签: ios uitableview timer swift3 tableviewcell

我不一定需要代码,但我会很感激如何处理我的问题的非常具体的步骤/逻辑。

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

我在tableviewcontroller中处理多个计时器的逻辑有问题。应为每个新创建的单元分配一个新的计时器对象,该对象是在创建该单元时创建的。这样,特定单元格使用使用特定UIPicker值创建的时间值。到目前为止,我只能将每个单元使用与创建的第一个单元相同的计时器值。

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

3 个答案:

答案 0 :(得分:2)

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

现在已经清除了,谁应该做逻辑?我相信你可以将计时器逻辑抽象到他们自己的对象中,因为对于表视图控制器来说,跟踪所有播放/暂停状态,已经过了多少时间等等都是一件麻烦事。

因此,为表视图控制器留下的工作只是从计时器对象获取数据(剩余时间),将它们转换为String s(这里你可能有格式化逻辑,VC应该handle)然后将这些字符串传递给单元格。

代码如下所示:

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

所以现在我们试着找出何时/如何获得细胞。 至于何时,那将是你的选择,我认为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()

希望这有帮助!我可能错过了一些东西所以请问

答案 1 :(得分:1)

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

答案 2 :(得分:0)

请使用以下代替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)