我想保留计时器值并从新UITableViewCell
开始显示它但我的问题是我能够成功地在第一个Cell上显示秒表计时器,但是当我尝试在{{{ 1}}所以我的计时器设置为第二个单元格,我无法定义如何让我的第一个计时器保持活动状态。
我想过管理一个数组,但我想每次都调用reload TableData,但我觉得这很糟糕:(
我尝试了如下所示的工作,但我不知道如何在前一个单元格上显示timerValue,使用相同计数的秒表动态和从开始时的新单元timerValue。
静态解决方案,但我的行是动态插入的,并且从TableView中删除,因此静态解决方案限制了我特定的行数,并寻找动态解决方案。
UITableView
答案 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;
}
通过这种方式,细胞不会被重复使用