ios 8 UITableViewCell细节文本没有正确更新

编辑:tl;博士:我可以导致detailTextLabel的大小由iOS中的自动布局系统更改值?

编辑2:我有一个部分的解决scheme,但将继续寻找一个更好的。 见下文。

自从iOS 8以来,其他人在UITableViewCell中的detailText标签有问题吗?

我有一个文本和详细string的表。 最初细节文本是一个空string(@“”)。 在向编辑屏幕执行故事板顺序之后,我将返回一个新的细节文本值并更新它。 我尝试在viewWillAppear中重新加载表,以便在返回到前一个视图时立即显示该值。

一旦表格视图再次可见,表格单元格将文本字段向上移动,以便为详细文本腾出空间,但不显示详细文本。 直到我回到编辑屏幕,文本才会显示,然后再回来。

我所做的解决方法:它看起来像细节文本标签的自动布局没有正确更新,因为我认为它应该,并loggingdetailTextLabel框架的大小和化妆确认这一点。

我可以通过在viewDidAppear中运行[table reloadData]来强制更新文本,但是这会给我带来一个我不喜欢的闪烁效果,而且看起来不专业。

编辑:我已经做了其他的事情:我也已经强制detailTextLabel使用[cell.detailTextLabel sizeToFit]重新调整自己的大小。 这导致它显示,但在单元格中以奇怪的方式偏移。 在再次进入编辑页面后,detailTextLabel修复了它的位置。

我创build了一个简单的项目作为github回购,以显示我正在处理的是什么:

https://github.com/acidaris/ios8_table_issue

我正在使用的视图控制器的主要代码也在下面。

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.table reloadData]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"]; cell.textLabel.text = @"This is a test"; cell.detailTextLabel.text = self.value; CGRect frame = cell.detailTextLabel.frame; NSLog(@"detailTextLabel x=%fy=%f width=%f height=%f", frame.origin.x,frame.origin.y,frame.size.width,frame.size.height); return cell; } 

单元格在StoryBoard中原型化,所以dequeueReusableCellWithIdentifier:选中的单元格总是被定义的。 此外,故事板内的单元格types设置为字幕,如果定义了初始值,则显示该单元格。

如果有人能帮我解决这个问题,我会非常感激。

部分解决scheme

如果您正在对UITableViewCell进行子分类,则可以在布局完成时修改detailTextLabel的框架。 这是我所做的,似乎工作, 但在6加,我得到了textLabel和detailTextLabel之间的一个奇怪的分界线。 编辑:(我调整了这一点)。我不喜欢这个解决scheme,但迄今为止,这是我遇到的最好的。 呈现视图后不会更新,而且相对简单。 正如我上面所说,我会继续寻找更好的解决scheme。

 - (void)layoutSubviews { [super layoutSubviews]; CGRect textFrame = self.textLabel.frame; [self.detailTextLabel sizeToFit]; CGFloat x = textFrame.origin.x; CGFloat y = textFrame.origin.y + textFrame.size.height; CGSize detailSize = self.detailTextLabel.frame.size; CGRect newFrame = CGRectMake(x, y, detailSize.width, detailSize.height); self.detailTextLabel.frame = newFrame; } 

我也更新了我的Github项目,以反映我目前的解决scheme。 编辑3:这并不完美,因为它有真正的自动布局框架的值错误,但它适用于我目前的用途。

编辑4:我已经更新了我的layoutSubviews函数更聪明。 它将调整标签内容的大小,并将标签正确地放置在与文本标签相关的x / y坐标中。

有同样的问题。 我的解决scheme是在返回单元格在-tableView:cellFForRowAtIndexPath结尾之前调用[cell layoutSubviews] 。 这适用于我,我没有发现有必要重写单元格子类中的layoutSubviews

当在故事板中使用segue时,我的cell没有正确更新。 试着

 [setNeedsLayout] and [layoutIfNeeded] 

在视图和tableview上,它不工作。

 [self.tableView reloadData] is in viewDidAppear, as it should. 

然后我尝试pixbug的build议,它的工作。 但是不应该直接使用[layoutSubviews]。 所以我尝试了单元格上的文档而不是tableView或视图的build议。

试着

 [cell setNeedsLayout] 

但是这不起作用。

试着

 [cell layoutIfNeeded] 

这为我工作。

我把这个之前,返回细胞。

我在iOS 8故事板中遇到了同样的问题(未启用自动布局)。

我有一个表视图与静态表视图单元格的底部。 在IB中,我在表格单元格的内容区域添加了一些空格(样式:“右侧细节”)。 然后在代码(ViewDidLoad)中,我更新了单元格的内容…

 self.copyrightsCell.detailTextLabel.text = @"<a string>"; 

没有IB空间,单元在纵向模式下是INVISIBLE。

但是对于最初的空格,单元格的内容稍后会正确显示。

希望这有助于某人。

我有同样的问题。 我确信数据是可用的,并被分配到cell.detailTextLabel.text我已经注意到,一旦一个值已被分配,那么没有闪烁如果返回到tableView的值更改。 所以在我看来,在detailTextLabel中首次赋值的时候只有一个问题。

所以,我遵循了这个步骤和其他许多。 这个引导我看起来是正确的答案。 我希望这可以帮助其他人,因为iOS 7/8做出了一些改变,所以这让我疯狂。

我的答案是把正常的处理代码在viewWillAppear并添加这个[self.tableview layoutSubviews],而不是[self.tableView重载数据]。 我认为这与苹果在iOS 7/8中的可控性有很大的关系。在回顾一些关于如何使用单元的信息时,我对这个想法有所了解。

再次,我希望这可以帮助别人解决这个烦人的问题。

我认为,如果你需要reloadData,这意味着表格数据创build时不会被加载。

你只需要将你的数据加载到你的tableview所在的viewdidload(或者在table view获取数据之前的其他地方),然后相应地创build这些单元格。

通常,我只是使用任何对象的数组,然后使用[array objectAtIndex:indexpath.row] ,你可能知道。

另外,你最后一段还有一个未完成的句子,看起来很重要。

使用Xcode 6.3.2(6D2105)确认问题OS X Yosemite 10.10.3我确定正确的值正在分配,仍然是第一次不显示,第二次显示。 cell.layoutSubviews()对我来说似乎是合乎逻辑的,因为它看起来好像视图缺less一个刷新,并添加layoutSubviews()的伎俩。

我有一个静态的UITableView类似的问题。 我更改标签的文本,它不会在屏幕上得到更新,除非我单击单元格或做任何事情来强制更新其视图。 我的解决方法是更新文本后调用:

tableView.reloadData()

PS这没有任何意义; 因为这是一个静态表格视图,我不知道为什么它的工作,但它!