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

Updating text of the label in the cell in the tableview every second in iOS

我想每秒更新 tableView 中每个单元格中每个标签的文本,方法是在两个 NSDate 之间进行计算,就像:“~days ~hours ~minutes ~seconds”

在 tableview 中,它在 cellForRowAtIndex 处绘制单元格,tableViewController.

的代表

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

- (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;
}

您需要重新加载 table,而不是每秒重新加载一个标签或单元格 - 这意味着 - 创建一个计时器并调用方法 [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;
}

您不能在 cellForRowAtIndex 中使用 [self.tableview reloadData]

如您所说,它将创建一个无限循环。

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

- (void)viewDidLoad
{
 [super viewDidLoad];

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

}

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

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

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

并在 targetMethod 中使用

[myTableView reloadData];