在iOS中每秒更新tableview中单元格中的标签文本

时间:2015-04-27 14:36:37

标签: ios objective-c uitableview timer nstimer

我想通过计算两个NSDate之间的每一个单元格来更新tableView中每个单元格中的每个标签的文本,如下所示:"〜天〜小时〜分钟〜秒"

在tableview中,它会在cellForRowAtIndex的代理人tableViewController处绘制单元格。

所以我尝试在[self.tableview reloadData]中使用计时器和方法reloadData:cellForRowAtIndex,但那时我认为它会产生无限循环并死掉。

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

    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                             target:self
                                           selector:@selector(updateLabel:)
                                           userInfo:nil 
                                            repeats:YES ];

    cell.timeLeftLabel.text=[self updateLabel:self.timer]; 
}


- (NSString *)updateLabel:(id)sender {
    /*At this method , i calculate left days,hours,minutes,seconds between two nsdates
    and I make the string by those values : */

    NSLog(@"updateLabel : %@",timeLeftString);
    return timeLeftString;
}

3 个答案:

答案 0 :(得分:4)

你需要每秒重新加载表,而不是标签或单元 - 这意味着 - 创建一个定时器和调用方法[tableView reloadData];

- (void)viewDidLoad {

    [super viewDidLoad];

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

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

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

    // setup cell
    cell.timeLeftLabel.text=[self updateLabel:self.timer];
}

- (NSString *)updateLabel:(id)sender {
    /*At this method , i calculate left days,hours,minutes,seconds between two nsdates
         and I make the string by those values : */

    NSLog(@"updateLabel : %@",timeLeftString);
    return timeLeftString;
}

答案 1 :(得分:2)

您无法使用[self.tableview reloadData]内的cellForRowAtIndex

正如你所说,它将创造一个无限循环。

而是在viewDidLoad中创建一个计时器,如下例所示:

- (void)viewDidLoad
{
 [super viewDidLoad];

 timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(increaseTimerCount) userInfo:nil repeats:YES]

}

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

答案 2 :(得分:1)

创建NSTimer并将其设置为每秒:

[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(targetMethod)
userInfo:nil
repeats:YES];

并在targetMethod使用

[myTableView reloadData];