6

我有一个使用自动布局的自定义表格视图单元格,并有一个披露指示器作为附件视图。首次显示时屏幕上单元格的单元格大小完全错误:

如您所见,该单元占用了大约 1.5 个屏幕的空间:

在此处输入图像描述

但是,如果我旋转设备并向后旋转,它看起来很好:

在此处输入图像描述

正如你在这里看到的,我没有做任何复杂的事情:

在此处输入图像描述

我有一个非常不理想的解决方法:

-(void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    [self.tableView reloadData];
}

但这显然会在您第一次看到屏幕时导致“闪光”。在更复杂的情况下,闪光更为明显。

我有另一种解决方法,但这会导致自动布局异常:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    BasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath];
    cell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines";
    [cell.basicLabel layoutIfNeeded];
    return cell;
}

例外:

在此处输入图像描述

至少这种方法不会让我 UI 闪烁。

如果我删除附件视图,它实际上工作得很好。

更新:我已经向 github 添加了一个示例项目: https ://github.com/fwaddle/TableCellAccessoryTest

更新#2:原来围绕这个错误的另一项工作是在代码中布局单元格。我只是尝试在代码中做同样的事情,它没有抛出警告并且工作正常。看起来像一个 IB 错误。

任何想法如何解决这个问题?谢谢。

4

2 回答 2

3

实现以下委托方法,因为这解决了我的问题。

- (void)tableView:(UITableView *)tableView   
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath

表格视图在使用单元格绘制一行之前将此消息发送给其委托人,从而允许委托人在单元格对象显示之前对其进行自定义。此方法使委托有机会覆盖先前由表视图设置的基于状态的属性,例如选择和背景颜色。委托返回后,表格视图仅设置 alpha 和 frame 属性,然后仅在为滑入或滑出的行设置动画时。

将此代码添加到您的 tableViewController:

 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell   forRowAtIndexPath:(NSIndexPath *)indexPath{

    BasicCell *basicCell = (BasicCell *)cell;
    basicCell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines";

}
于 2015-05-08T03:53:24.990 回答
0

所以即使在代码中创建约束有时也不能解决这个问题。看来您还需要进行一些更改。在您的自定义表格单元格中添加以下内容,特别是如果您根据单元格的内容(例如复选标记)更改附件类型:

-(void) setAccessoryType:(UITableViewCellAccessoryType)accessoryType {
  [super setAccessoryType:accessoryType];
  [self setNeedsUpdateConstraints];
}

还要删除情节提要中的原型单元并注册您的类:

-(void) viewDidLoad {
  [super viewDidLoad];
  [self.tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"MyCustomCell"];
}

我偶尔会发现我仍然需要强制标签(尤其是似乎是多行标签)在 cellForRowAtIndexPath 中重新布局:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell" forIndexPath:indexPath];
  cell.customLabel.text = .....
  [cell.customLabel layoutIfNeeded];
  return cell;
}

以上所有解决了我的问题,所以我希望它们对其他人有用,并且您不要在此浪费大量时间。

我仍然没有从 Apple 那里收到关于错误报告的任何回复,但我认为这很正常。

于 2015-08-06T21:33:01.797 回答