UITableView重新加载数据有效,但单元格不会在屏幕上更新

时间:2015-04-11 16:30:11

标签: ios uitableview reloaddata

我正在更改UITableViewCell中标签中的文本。我在主线程中这样做。我正在记录我正在这样做以证明我的更新正在被调用。

更新未在屏幕上反映。

FWIW,我之前已经完成了几十次这样的工作。我这次不会得到我可能做的不同。

我用Google搜索了一些想法。 99%的答案是“确保你发送到主线程”(我正在这样做),3%是“确保你的tableview被连线并且你的cellForIndexPath被调用”(已经完成)。另外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标签只有在我隐藏时才会更新。重新显示表(它在我可以弹出的视图控制器中。)我正在尝试让表更新为实时更新,作为通知的结果。 (是的,这就是我派遣到主线程的原因。)

任何提示?

谢谢!

1 个答案:

答案 0 :(得分:1)

不是100%确定是否是问题,但标签的标签不匹配。您尝试使用cellProgressTag

来获取它
UILabel *lProgress = (UILabel*) [cell viewWithTag: cellDescriptionTag];

但是当它为nil时,您会创建标签并设置标记cellProgressTag

lProgress.tag = cellProgressTag;

这样,下次您要求标记为cellProgressTag的视图时,您将再次获得nil