UITableView 重新加载数据有效,但单元格不会在屏幕上更新
UITableView reload data works, but cells don't update on screen
我正在更改 UITableViewCell 中标签中的文本。我在主线程中进行。我正在记录我这样做是为了证明正在调用我的更新。
更新未反映在屏幕上。
FWIW,我以前做过几十次,而且很有效。我不知道这次我可能会做些什么。
我用谷歌搜索了想法。 99% 的答案是 "make sure you dispatch to main thread"(我正在这样做),3% 是 "make sure your tableview is wired up and your cellForIndexPath is being called"(已经完成)。其他 1.5% 是人们猜测的各种可怕的答案。 ;)
一些代码(重要的是最后几行。剩下的只是设置):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// blah blah snip.
NSString * const cellID = NSStringFromClass([self class]);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellID];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: cellID];
cell.backgroundColor = [UIColor clearColor];
}
// blah blah more snip
// setup progress label
// >>>Solution<<< (thanks @Dennis !) -- wrong label here. Should be cellProgressTag
UILabel *lProgress = (UILabel*) [cell viewWithTag: cellDescriptionTag];
if (lProgress == nil)
{
float startX = 0;
CGRect lRect = lTitle.frame;
CGRect frame = CGRectMake(startX, (lRect.origin.y + lRect.size.height), (width - startX), 18);
lProgress = [[UILabel alloc] initWithFrame: frame];
lProgress.tag = cellProgressTag;
UIFont *font = lProgress.font;
lProgress.font = [font fontWithSize: 14];
lProgress.textAlignment = NSTextAlignmentCenter;
lProgress.textColor = textColor;
[cell.contentView addSubview: lProgress];
}
// blah blah more snip
// fill-out cell
NSInteger row = [indexPath row];
// blah blah more snip
lProgress.text = [NSString stringWithFormat: @"current level: %d %@", currentLevel, neededStr];
if ([key isEqualToString: @"EE"]) NSLog(@"%s %@ lProgress: %@", __PRETTY_FUNCTION__, (([NSThread isMainThread]) ? @"(main thread)" : @"NOT MAIN THREAD"), lProgress); // DEBUG
lDescr.text = [NSString stringWithFormat: @"%@%@", _descriptionPrefix, [oneTech objectForKey: @"description"]];
return cell;
}
示例日志输出:
2015-04-11 09:11:01.074 worfc[20202:5918312] -[myapp tableView:cellForRowAtIndexPath:] (main thread) lProgress: <UILabel: 0x815bd5f0; frame = (30 53; 320 30); text = 'current level: 0 74.1...'; userInteractionEnabled = NO; tag = 102; layer = <_UILabelLayer: 0x815bd6b0>>
2015-04-11 09:11:03.925 worfc[20202:5918312] -[myapp tableView:cellForRowAtIndexPath:] (main thread) lProgress: <UILabel: 0x815bd5f0; frame = (30 53; 320 30); text = 'current level: 0 76.6...'; userInteractionEnabled = NO; tag = 102; layer = <_UILabelLayer: 0x815bd6b0>>
然而 lProgress
标签只有在我隐藏并重新显示 table 时才会更新(它在我可以弹出的视图控制器中。)我正在尝试获取 table 实时更新,作为通知的结果。 (是的,这就是我分派到主线程的原因。)
有什么提示吗?
谢谢!
不能 100% 确定这是否是问题所在,但标签的标记不匹配。您尝试使用 cellProgressTag
:
获取它
UILabel *lProgress = (UILabel*) [cell viewWithTag: cellDescriptionTag];
但是当它是 nil
时,您创建标签并设置标记 cellProgressTag
:
lProgress.tag = cellProgressTag;
这样,下次您请求带有标签 cellProgressTag
的视图时,您将再次获得 nil
。
我正在更改 UITableViewCell 中标签中的文本。我在主线程中进行。我正在记录我这样做是为了证明正在调用我的更新。
更新未反映在屏幕上。
FWIW,我以前做过几十次,而且很有效。我不知道这次我可能会做些什么。
我用谷歌搜索了想法。 99% 的答案是 "make sure you dispatch to main thread"(我正在这样做),3% 是 "make sure your tableview is wired up and your cellForIndexPath is being called"(已经完成)。其他 1.5% 是人们猜测的各种可怕的答案。 ;)
一些代码(重要的是最后几行。剩下的只是设置):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// blah blah snip.
NSString * const cellID = NSStringFromClass([self class]);
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellID];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: cellID];
cell.backgroundColor = [UIColor clearColor];
}
// blah blah more snip
// setup progress label
// >>>Solution<<< (thanks @Dennis !) -- wrong label here. Should be cellProgressTag
UILabel *lProgress = (UILabel*) [cell viewWithTag: cellDescriptionTag];
if (lProgress == nil)
{
float startX = 0;
CGRect lRect = lTitle.frame;
CGRect frame = CGRectMake(startX, (lRect.origin.y + lRect.size.height), (width - startX), 18);
lProgress = [[UILabel alloc] initWithFrame: frame];
lProgress.tag = cellProgressTag;
UIFont *font = lProgress.font;
lProgress.font = [font fontWithSize: 14];
lProgress.textAlignment = NSTextAlignmentCenter;
lProgress.textColor = textColor;
[cell.contentView addSubview: lProgress];
}
// blah blah more snip
// fill-out cell
NSInteger row = [indexPath row];
// blah blah more snip
lProgress.text = [NSString stringWithFormat: @"current level: %d %@", currentLevel, neededStr];
if ([key isEqualToString: @"EE"]) NSLog(@"%s %@ lProgress: %@", __PRETTY_FUNCTION__, (([NSThread isMainThread]) ? @"(main thread)" : @"NOT MAIN THREAD"), lProgress); // DEBUG
lDescr.text = [NSString stringWithFormat: @"%@%@", _descriptionPrefix, [oneTech objectForKey: @"description"]];
return cell;
}
示例日志输出:
2015-04-11 09:11:01.074 worfc[20202:5918312] -[myapp tableView:cellForRowAtIndexPath:] (main thread) lProgress: <UILabel: 0x815bd5f0; frame = (30 53; 320 30); text = 'current level: 0 74.1...'; userInteractionEnabled = NO; tag = 102; layer = <_UILabelLayer: 0x815bd6b0>>
2015-04-11 09:11:03.925 worfc[20202:5918312] -[myapp tableView:cellForRowAtIndexPath:] (main thread) lProgress: <UILabel: 0x815bd5f0; frame = (30 53; 320 30); text = 'current level: 0 76.6...'; userInteractionEnabled = NO; tag = 102; layer = <_UILabelLayer: 0x815bd6b0>>
然而 lProgress
标签只有在我隐藏并重新显示 table 时才会更新(它在我可以弹出的视图控制器中。)我正在尝试获取 table 实时更新,作为通知的结果。 (是的,这就是我分派到主线程的原因。)
有什么提示吗?
谢谢!
不能 100% 确定这是否是问题所在,但标签的标记不匹配。您尝试使用 cellProgressTag
:
UILabel *lProgress = (UILabel*) [cell viewWithTag: cellDescriptionTag];
但是当它是 nil
时,您创建标签并设置标记 cellProgressTag
:
lProgress.tag = cellProgressTag;
这样,下次您请求带有标签 cellProgressTag
的视图时,您将再次获得 nil
。