UITab中的UILabel未在NSTimer上更新

时间:2014-02-05 07:21:23

标签: objective-c uitableview nstimer

在viewDidAppear方法中,我初始化了一个NSTimer。 (self.dayView在loadView方法中初始化。)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];


    self.timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                  target:self
                                                selector:@selector(reloadTableView)
                                                userInfo:nil
                                                 repeats:YES];
}

- (void)reloadTableView {
    [self.dayView.tableView reloadData];
}

我的cellForRowAtIndexPath看起来像这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"cell for row at indexpath called");
    MatchEventCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath];
    MatchEvent *event = [self getMatchEventAtIndexPath:indexPath];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponents = [calendar components:NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit
                                                   fromDate:[NSDate date]
                                                     toDate:event.startDate
                                                    options:0];

    cell.textLabel.text = [NSString stringWithFormat:@"%d:%d:%d", [dateComponents hour], [dateComponents minute], [dateComponents second]];
    NSLog(@"TEXT = %@", cell.textLabel.text);

    return cell;
}

当我在模拟器中测试此计时器时,我的单元格中的标签未更新。 当我查看NSLog时,我看到“TEXT = ...”设置为textLabel的新值。

为什么我的标签没有直观更新,尽管NSLog显示textLabel有新文本?

1 个答案:

答案 0 :(得分:0)

每当您对基础数据源进行更改时,都需要更新表视图手册。 UITableView's reloadData方法是快速且效率低下的方法。 正确的方法是:

NSArray *cells = [myTableView visibleCells];
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
for (UITableViewCell *cell in cells) {
    [indexPaths addObject:[myTableView indexPathForCell:cell]];
}
[myTableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:NO];
[indexPaths release];

滚动后会显示其余不可见的行。

让我们知道这是否有效,否则可能是线程问题......