所以这是一个奇怪的。我有一个带有UIVIew *
标题元素的布局,一个UIButton *
页脚元素和一个UITableView *
元素。
//each of these are instantiated in their own lazyload method
[self.view addSubview:self.headerView];
[self.view addSubview:self.tableView];
[self.view addSubview:self.footerButton];
NSDictionary * viewList= @{
@"header":self.headerView,
@"table":self.tableView,
@"footer":self.footerButton
};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[header(40)][table][footer(50)]|" options:0 metrics:nil views:viewList]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[header]|" options:0 metrics:nil views:viewList]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[table]|" options:0 metrics:nil views:viewList]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[footer]|" options:0 metrics:nil views:viewList]];
现在,执行在第一次addConstraints调用时失败,并显示以下消息:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: 'Unable to parse constraint format:
Unable to interpret '|' character, because the related view doesn't have a superview
V:|[header(40)][table][footer(50)]|
^'
我的所有观看次数都translatesAutoresizingMaskIntoConstraints
设置为NO
。
奇怪的是,如果在添加约束之前我NSLog
,我可以看到self.view.subviews
正确列出了所有三个视图。但是,self.footerButton.superview
不知何故nil
(其他两个都很好)。
如何将视图添加到视图层次结构中,但是没有设置自己的超级视图?
答案 0 :(得分:1)
想出来。 footerButton的延迟加载getter意外地返回了意图分配给ivar的临时视图而不是返回ivar本身,因此每次调用self.footerButton
都会返回一个新实例。因此,第一次调用WAS被正确地分配给父视图,但是在构建viewList
时,创建了一个未分配给任何内容的新视图。