需要指导以维护每个Uitableviewcell的NSTimer

时间:2014-09-03 07:33:32

标签: ios objective-c

如果我需要为每个细胞使用计时器,可能是最好的方法,

示例: - 每个单元格从时间倒计时开始,以某个值开始(假定为50),并且每个时钟周期都会减少,直到零,当它的值为零时,我们需要用动画删除该单元格。每隔一秒,我们应该更新每个cel计数器值作为每个单元的计时器将改变。我真的需要帮助来实现这个解决方法。你的建议可以使我的实施变得容易。

解决方法(我觉得很好)是在NSManageObject中使用timer属性(NSTimer)实现计时器,并使用NSFetchedResultsController监听数据源更改以更新tableview。但这是用这种方法维护整个tableview的好方法吗?

提前感谢您的帮助。

3 个答案:

答案 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];