动态显示UITableViewCell中的StopWatch Timer

时间:2013-06-17 12:12:56

标签: iphone ios objective-c xcode4.5 nstimer

我想保留计时器值并从新UITableViewCell开始显示它但我的问题是我能够成功地在第一个Cell上显示秒表计时器,但是当我尝试在{{{ 1}}所以我的计时器设置为第二个单元格,我无法定义如何让我的第一个计时器保持活动状态。

我想过管理一个数组,但我想每次都调用reload TableData,但我觉得这很糟糕:(

我尝试了如下所示的工作,但我不知道如何在前一个单元格上显示timerValue,使用相同计数的秒表动态和从开始时的新单元timerValue。

静态解决方案,但我的行是动态插入的,并且从TableView中删除,因此静态解决方案限制了我特定的行数,并寻找动态解决方案。

UITableView

1 个答案:

答案 0 :(得分:13)

我不确定是否明白了你的要求......但我试试。

一个简单的解决方案可以是将UITableViewCell子类化并将计时器添加到单元格本身。因此,单元格将具有对计时器的引用,并且每次将新单元格添加到TableView时将创建一个新单元格

我附上示例代码:Link(我已经静态添加了3个单元格,但您可以根据需要添加,只需点击一个单元格即可启动计时器,如果再次点击,计时器将从0再次启动)

创建自定义单元格子类并添加以下方法:

- (void) startTimer
{

    // invalidate a previous timer in case of reuse
    if (self.timer)
        [self.timer invalidate];


    self.startTime = [NSDate date];

    // create a new timer
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.6 target:self selector:@selector(calculateTimer) userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

    [self.timer fire];
}

- (void)calculateTimer
{
    NSTimeInterval interval = [self.startTime timeIntervalSinceNow];
    interval = (-1 * interval);

    NSString *intervalString = [NSString stringWithFormat:@"%f", interval];

    self.timerLabel.text = intervalString;
}

然后,在UITableViewController实现中,只需调用

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    TimerCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    [cell startTimer];
}

有关详细信息,请查询或查看附件项目。

这是我发现的最快的方式,虽然有人宁愿在表视图控制器中保留定时器代码和引用(但是你需要更多的代码)

<强> 修改

如Spynet的评论中所写,如果你有超过7/8个单元格(可以适合屏幕的单元格数量),这将无法工作,因为当你滚动UITableView单元格时会重复使用。因此,单个单元格将用于不同的indexPaths,因此在第一个单元格上启动计时器,然后滚动,将使您看到计时器已经每7/8个单元格启动(因为它是先前创建的单元格的计时器)

要解决这个问题,有很多方法。一种可能是从单元格中删除计时器并在ViewController中创建一组计时器。每个索引路径的一个计时器。 另一种方式(但如果细胞很多,我没有重新确认)是不要重复使用细胞。

从我的示例项目开始:
1 - 创建一个nib文件(称之为TimerCell.xib)并从故事板中复制/粘贴单元原型 2 - 将此属性添加到TimerViewController

@interface TimerViewController ()
@property (strong, nonatomic) NSMutableArray *cells;
@end
initWithCoder方法中的

3 - 初始化数组:

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        _cells = [NSMutableArray array];
    }
    return self;
}

4 - 更新cellForRowAtIndexPath方法并将其更改为:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    TimerCell *cell = nil;

    if ([self.cells count] > indexPath.row)
    {
        cell = [self.cells objectAtIndex:indexPath.row];
    } else {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"TimerCell" owner:self options:nil] objectAtIndex:0];
        [self.cells addObject:cell];
    }

    // Configure the cell...

    return cell;
}

通过这种方式,细胞不会被重复使用