我不一定需要代码,但我会很感激如何处理我的问题的非常具体的步骤/逻辑。
我的初始视图控制器是一个表视图控制器。它将显示单个定时器值并在当前单元格中显示其倒计时。从单独的常规视图控制器检索计时器值。此视图控制器包含UIPicker,并使用选择器中用户选择的值计算计时器值。
我在tableviewcontroller中处理多个计时器的逻辑有问题。应为每个新创建的单元分配一个新的计时器对象,该对象是在创建该单元时创建的。这样,特定单元格使用使用特定UIPicker值创建的时间值。到目前为止,我只能将每个单元使用与创建的第一个单元相同的计时器值。
如何告诉位于我的初始表视图控制器中的新创建的单元格,它应该只使用由用户选择的特定计时器值创建的值,而第二个视图控制器中的UIPicker?如何在单元格之间分隔计时器值?
答案 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。
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.
});
NSTimer.scheduledTimerWithTimeInterval(1,
target: NSBlockOperation(block: {...}),
selector: #selector(NSOperation.main),
userInfo: nil,
repeats: true)