使用AutoLayout将addSubview崩溃到UITableView后崩溃

时间:2014-03-14 14:47:01

标签: ios autolayout

当我使用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 个答案:

答案 0 :(得分:3)

问题是您是直接向UITableView 添加子视图,试图让它参与表视图的约束。这些都是糟糕的想法,第二个特别是导致你的崩溃。没有为这类事情设置表格视图。

如果你能解释一下你实际上要做什么,这将有所帮助。如果你想在桌子视图的顶部放置一些东西以便它覆盖它(虽然你为什么要这样做会击败我),把它作为self.view的另一个子视图并用限制来固定它self.view。保留表格视图以适应自己。

编辑:从评论中我发现,当你在没有自动布局的情况下这样做时,这很有用。然后继续做它没有自动布局!问题源于您尝试在表视图内部强制执行自动布局,该视图不使用自动布局而不喜欢它。通过自动布局调整表视图本身的大小/位置没有问题,但在子视图中不使用自动布局。回到你以前的方式,它会像以前一样工作。