0

好的,所以这是我的困境自动取款机。

我有一个带有 UITableView (tableView) 和 UIView (viewForTableHeader) 的故事板,其中包含几个其他对象,如 UIImag、标签等。

以编程方式,我通过执行以下操作将 UIView 设置为 UITableView 的标题:

    [self.tableView setTableHeaderView:self.viewForTableHeader];

这在不使用自动布局时非常有效。

但是使用自动布局,应用程序崩溃并给我留下:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“执行 -layoutSubviews 后仍需要自动布局。UITableView 的 -layoutSubviews 实现需要调用 super.'

所以在 viewDidLoad 我试图将约束设置viewForTableHeader为:

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.viewForTableHeader attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:NSLayoutAttributeTop multiplier:0 constant:0];
[self.view addConstraint:constraint];
constraint = [NSLayoutConstraint constraintWithItem:self.viewForTableHeader attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.tableView attribute:NSLayoutAttributeLeft multiplier:0 constant:0];
[self.view addConstraint:constraint];

我也试过:

- (void)layoutSublayersOfLayer:(CALayer *)layer {
    [super layoutSublayersOfLayer:self.tableView.layer];

并做了同样的事情试图在这里设置约束

}

viewForTableHeader把它放在一个 nib 文件中会更好吗?我确实对此有点不满意,所以任何帮助或指示都会有所帮助。

4

1 回答 1

1

由于您在 IB 中同时拥有(tableView 和 headerView),您可以将 viewForTableHeader拖到(上方)tableView 并将其设置为表头。

这将使 headerView 出现在视图层次结构中的 tableView下方

如果您这样做,您将能够稍后在运行时将此视图删除/添加到表中,而不会出现自动布局错误或额外的约束。

  [self.viewForTableHeader removeFromSuperview];

然后

  [self.tableView setTableHeaderView:self.viewForTableHeader];
于 2013-04-21T12:16:44.050 回答