UIView superview字段未设置

时间:2015-03-27 14:37:03

标签: ios objective-c autolayout

所以这是一个奇怪的。我有一个带有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(其他两个都很好)。

如何将视图添加到视图层次结构中,但是没有设置自己的超级视图?

1 个答案:

答案 0 :(得分:1)

想出来。 footerButton的延迟加载getter意外地返回了意图分配给ivar的临时视图而不是返回ivar本身,因此每次调用self.footerButton都会返回一个新实例。因此,第一次调用WAS被正确地分配给父视图,但是在构建viewList时,创建了一个未分配给任何内容的新视图。