在 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];
我想每秒更新 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];