iOS 8:UITableViewCell详细文本无法正确更新

时间:2014-09-23 04:53:11

标签: ios objective-c uitableview autolayout viewwillappear

tl; dr:我是否可以通过iOS中的自动布局系统更改detailTextLabel的大小来更改值?

自iOS 8以来,是否有其他人在UITableViewCell中遇到了detailText标签的问题?

我有一个表格,包含文字和细节字符串。最初的详细文本是一个空字符串(@"")。在将故事板segue执行到编辑屏幕后,我返回一个新的详细文本值并更新它。我尝试在viewWillAppear中重新加载表,以便在返回上一个视图后立即显示该值。

表格视图再次可见后,表格单元格已将文本字段向上移动以为详细文本腾出空间,但不显示任何明细文本。在我返回编辑屏幕并再次返回之前,文本不会显示。

我在解决问题方面所做的工作:看起来我认为详细文字标签的自动布局没有按照我认为应该正确更新,并记录大小和detailTextLabel框架的构成证实了这一点。

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

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

我已经创建了一个简单的项目作为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=%f y=%f width=%f height=%f",
        frame.origin.x,frame.origin.y,frame.size.width,frame.size.height);
    return cell; 
}

单元格在StoryBoard中进行原型化,因此始终定义dequeueReusableCellWithIdentifier:选择的单元格。此外,故事板中的单元格类型设置为字幕,如果定义了初始值,它会显示。

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

部分解决方案

如果要对UITableViewCell进行子类化,则可以在布局完成后修改detailTextLabel的帧。这就是我所做的,而且它似乎有效,但是在6加上,我在textLabel和detailTextLabel之间得到了一个奇怪的分界线。编辑:(我已调整为这个。)我不喜欢这个解决方案,但到目前为止,它是我遇到过的最好的解决方案。它在呈现视图后不会更新,并且相对简单。如上所述,我将继续寻找更好的解决方案。

- (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项目,以反映我目前的解决方案。编辑3:这并不能完美地工作,因为它对于真正的自动布局框架具有错误的值,但它适用于我目前的用途。

编辑4:我已将layoutSubviews功能更新为更智能。它将调整标签内容的大小,并将标签放置在相对于文本标签的x / y坐标内。

8 个答案:

答案 0 :(得分:19)

遇到同样的问题。我的解决方案是在[cell layoutSubviews]结束时返回单元格之前调用-tableView:cellFForRowAtIndexPath。这对我有用,我没有必要覆盖单元子类中的layoutSubviews

答案 1 :(得分:8)

我在故事板中使用segue时,单元格无法正确更新存在同样的问题。 试过

[setNeedsLayout] and [layoutIfNeeded]

在视图和tableview上它不起作用。

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

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

尝试

[cell setNeedsLayout] 

但这不起作用。

尝试

[cell layoutIfNeeded] 

这适合我。

我在退回牢房之前把它放了。

答案 2 :(得分:2)

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

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

更新了该单元格的内容
self.copyrightsCell.detailTextLabel.text = @"<a string>";

没有IB空格,单元格在纵向模式下是不可见的。

但是在初始空格中,单元格的内容以后会正确显示。

希望这有助于某人。

答案 3 :(得分:1)

我有同样的问题。 我确信数据可用并分配给cell.detailTextLabel.text 我注意到,一旦分配了一个值,如果在返回tableView时更改了值,则没有闪烁。 所以在我看来,第一次赋值给detailTextLabel时只会出现问题。

答案 4 :(得分:1)

所以,我跟着这个步骤和其他许多人。这个引导我看似正确的答案。我希望这有助于其他人,因为这让我疯狂,因为iOS 7/8做了一些改变。

我的回答是将正常处理代码放在viewWillAppear中并添加[self.tableview layoutSubviews]而不是[self.tableView reload data]。我认为这与苹果公司在iOS 7/8中使事情更具可控性有关。在审查细胞如何运作的一些信息时,我想到了这个想法。

同样,我希望这可以帮助其他人解决这个恼人的问题。

答案 5 :(得分:0)

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

您只需要在您的tableview所在的viewdidload(或表视图获取其数据之前的其他位置)加载您的数据,然后相应地创建单元格。

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

另外,你吃的最后一段有一个看似重要的未完成的句子。

答案 6 :(得分:0)

使用Xcode 6.3.2(6D2105)OS X Yosemite 10.10.3确认问题 我确保正在分配正确的值,仍然是第一次没有显示,  第二次表演。 cell.layoutSubviews()对我来说似乎合乎逻辑,因为看起来好像视图缺少刷新并添加layoutSubviews()就可以了。

答案 7 :(得分:0)

我遇到了与静态UITableView类似的问题。我更改了标签的文本,除非我点击单元格或做了任何强制更新其视图的操作,否则它不会在屏幕上更新。 我的解决方法是在更新文本后调用:

year hour 2015-01-25 02:59:00

P.S这没有任何意义;因为这是一个静态表视图,我不知道它为什么有效,但确实如此!