如果我需要为每个细胞使用计时器,可能是最好的方法,
示例: - 每个单元格从时间倒计时开始,以某个值开始(假定为50),并且每个时钟周期都会减少,直到零,当它的值为零时,我们需要用动画删除该单元格。每隔一秒,我们应该更新每个cel计数器值作为每个单元的计时器将改变。我真的需要帮助来实现这个解决方法。你的建议可以使我的实施变得容易。
解决方法(我觉得很好)是在NSManageObject中使用timer属性(NSTimer)实现计时器,并使用NSFetchedResultsController监听数据源更改以更新tableview。但这是用这种方法维护整个tableview的好方法吗?
提前感谢您的帮助。
答案 0 :(得分:4)
我会使用NSMutableArray
NSNumbers
,其中每个NSNumber代表剩余的值。
在UITableView
中显示这些内容非常简单。
然后设置一个重复的NSTimer
,其中包含'滴答'每一秒。在每个tick上迭代数组并递减值。如果值为0,则从数组中删除该元素,并从表中删除相应的行(假设self.values
是您的NSMutableArray细胞计数) -
-(void) handleTick {
[self.tableView beginUpdates];
NSMutableArray *reloadRows=[NSMutableArray new];
for (int i=0;i<self.values.count;i++) {
NSNumber *number=self.values[i];
NSInteger val=[number integerValue]-1;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
if (val > 0) {
values[i]=NSNumber numberWithInteger:val];
[reloadRows addObject:indexPath];
}
else {
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.values removeObjectAtIndex:i--];
}
}
if (reloadRows.count > 0) {
[self.tableView reloadRowsAtIndexPaths:reloadRows withRowAnimation:UITableViewRowAnimationNone];
}
[self.tableView endUpdates];
if (self.values.count == 0) {
[self.timer invalidate]; // Stop the timer if there is no data left
}
}
答案 1 :(得分:0)
不确切地知道你想做什么。作为&#34;示例&#34;说,你可以为所有细胞使用一个计时器。每个单元格都有一个初始值(可能不同),每秒,你倒数这些值,如果一个单元格的值达到零,则从tableview中删除它。
答案 2 :(得分:0)
不确定它是最好的代码但是试试
1)创建tableViewCell的子类
2)使单元格属性为int:counter; NSTimer * countdownTimer; UIViewController * parentController;
3)在单元格中写出 - (void)startCountDown和 - (void)countDown方法的种类;
4)在startCountDown方法中调用
NSTimer *countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countDown) userInfo:nil repeats:YES];
5)在countDown方法中,执行counter - = counter并检查counter是否&gt; 0.如果是在parentController中调用某个方法,它将执行您想要的操作并重新加载tableview数据。别忘了让计时器无效。
6)在cellForRowAtIndexPath中:为你的单元格设置counter和parentController并调用[cell startCountDown];