使用 AutoLayout addSubview 到 UITableView 后崩溃

Posted

技术标签:

【中文标题】使用 AutoLayout addSubview 到 UITableView 后崩溃【英文标题】:Crashed after addSubview to a UITableView using AutoLayout 【发布时间】:2014-03-14 14:47:00 【问题描述】:

当我使用 AutoLayout 技术将子视图添加到表视图时,我的代码崩溃了,这是我的代码:

@interface GNViewController () 
    UITableView     *_tvResults;
    UIView          *_view;


@end

@implementation GNViewController



- (void)viewDidLoad

    [super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor blueColor];

_tvResults = [UITableView new];
_tvResults.backgroundColor = [UIColor greenColor];
[self.view addSubview:_tvResults];

_view = [UIView new];
_view.backgroundColor = [UIColor redColor];
[_tvResults addSubview:_view];

_tvResults.translatesAutoresizingMaskIntoConstraints = NO;
_view.translatesAutoresizingMaskIntoConstraints = NO;

NSArray *cs = [NSLayoutConstraint constraintsWithVisualFormat:@"|[_tvResults]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tvResults)];
[self.view addConstraints:cs];

cs = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_tvResults]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_tvResults)];
[self.view addConstraints:cs];



cs = [NSLayoutConstraint constraintsWithVisualFormat:@"|[_view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_view)];
[_tvResults addConstraints:cs];

cs = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_view)];
[_tvResults addConstraints:cs];


@end

崩溃消息如下:

2014-03-14 22:45:06.801 asdjasjdasdasd[3758:a0b] * -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2903.2/UIView.m:8536 中的断言失败 2014-03-14 22:45:06.805 asdjasjdasdasd[3758:a0b] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“执行 -layoutSubviews 后仍需要自动布局。 UITableView的-layoutSubviews的实现需要调用super。'

请大家帮帮我,先谢谢了!

【问题讨论】:

【参考方案1】:

问题是您直接将子视图添加到 UITableView 并且试图将其包含在表视图的约束中。这些都是坏主意,尤其是第二个会导致您的崩溃。表视图不是为这类事情设置的。

如果你能解释一下你真正想要做什么,这会有所帮助。如果你想在表格视图的顶部放置一些东西以便它覆盖它(尽管你为什么要这样做让我很生气),让它成为self.view 的另一个子视图,并将它的约束固定到@987654322 @。让表格视图自生自灭。

编辑:从评论中,我了解到当您在没有自动布局的情况下这样做时,这很有效。然后在没有自动布局的情况下继续这样做!问题源于您尝试在表格视图内部强加自动布局,该视图不使用自动布局并且不喜欢那样。让表格视图本身通过自动布局调整大小/定位但不在其子视图上使用自动布局没有问题。只需回到您之前执行此操作的方式,它就会照常工作。

【讨论】:

感谢您的快速回复,马特!实际上,我想在tableview没有数据的时候给用户显示一条消息,所以我添加了一个subview,它的hidden属性一开始设置为YES,如果tableview的numberOfRow = 0则设置为NO。原因我不想把它加到self.view是这样的,我还在tableview中添加了pull刷新,如​​果我直接将消息视图添加到self.view,那么我不能再触发pull刷新了......我用老派风格成功地玩了这个把戏,但在使用自动布局时失败了。 自动布局将继续失败。你无能为力。表格视图在其直接子视图内部不使用自动布局,因此您尝试对其强加自动布局会使它感到不安。无需自动布局即可。 可惜表格视图不支持子视图的自动布局,因为我喜欢这项技术并且想在任何地方使用它,看来这次我必须像以前一样......还是谢谢你! @D.D.您只需将要显示的视图添加到tableViewtableFooterViewtableHeaderView 属性即可。 ios8支持tableview子视图自动布局。

以上是关于使用 AutoLayout addSubview 到 UITableView 后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 addSubview 中调用具有动态 ScrollView ContentSize Autolayout 的 CustomView

使用 Autolayout 将 CustomView 适配到 SuperView

AddSubview 和 PresentModal 问题

iPhone,addSubView 不调用 willViewAppear?

正确使用 addSubView?

addSubview 方法是啥样的?