iOS:addConstraints:崩溃应用

3

问题

我似乎无法将自动布局应用于我的现有项目。

详情

我之前遇到了与这个问题presentViewController: crash on iOS <6 (AutoLayout)相同的问题,但提供的答案都不适用于我:我正在使用所有故事板视图而没有xib。我的“使用自动布局”设置已经关闭,我仅使用iOS 6。

我的视图控制器最初崩溃了,所以我设置了延迟添加约束,现在我的应用程序在任何addConstraints:调用期间崩溃。最糟糕的是它不会告诉我原因。

代码

我会链接我的代码,但它非常简单明了。

-(void)addAllConstraints
{
    NSDictionary * views = NSDictionaryOfVariableBindings(_memoryImage, _peopleView, _contentHolder, _commentsTableView);
    NSArray * constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[_memoryImage]-50-[_peopleView]-0-[_contentHolder]-0-[_commentsTableView]" options:0 metrics:nil views:views];
    NSLog(@"Views %@, Constraints %@", views, constraints);
    [_peopleView addConstraints:constraints];
    [_memoryImage addConstraints:constraints];
    [_contentHolder addConstraints:constraints];
   [_commentsTableView addConstraints:constraints];
}

应用在_peopleView调用addConstraints时崩溃。视图和NSLayoutConstraints都已成功创建。

有什么想法吗?谢谢,节日快乐。

编辑:

添加崩溃日志以显示没有显示任何有用信息:

2012-12-25 10:40:13.936 -----[4955:907] Views {
"_commentsTableView" = "<UITableView: 0x1eb6be00; frame = (0 372; 320 100); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x1e51ce00>; layer = <CALayer: 0x1e51cee0>; contentOffset: {0, 0}>";
"_contentHolder" = "<UIView: 0x1e5c6590; frame = (0 270; 320 112); layer = <CALayer: 0x1e5c27f0>>";
"_memoryImage" = "<UIButton: 0x1e5c4aa0; frame = (0 0; 320 280); opaque = NO; layer = <CALayer: 0x1e5c4b60>>";
"_peopleView" = "<UIView: 0x1f0ceea0; frame = (0 230; 320 50); layer = <CALayer: 0x1f0cf790>>";

Constraints (
"NSLayoutConstraint:0x1e51a880 V:[UIButton:0x1e5c4aa0]-(50)-[UIView:0x1f0ceea0]",
"NSLayoutConstraint:0x1e5ba4e0 V:[UIView:0x1f0ceea0]-(0)-[UIView:0x1e5c6590]",
"NSLayoutConstraint:0x1e51b860 V:[UIView:0x1e5c6590]-(0)-[UITableView:0x1eb6be00]"
)


}  
   (lldb) 

它肯定会在崩溃日志中给你一些信息。作为入门,你的间隔常量应该放在方括号中。 - jrturton
https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW11不是真的。而且,崩溃日志中根本没有任何东西。 - Rob Caraway
@RobCaraway 应该至少说明发生了什么类型的崩溃。是 SIGABRTEXC_BAD_ACCESS?还是其他什么? - user529758
我对括号的使用方法有误,非常抱歉。我认为rdelmar已经回答了你的问题,但是在调试约束时,您可能会发现添加所有异常断点很有用。 - jrturton
rdelmar 确实是正确的。不过,为了未来的观察者澄清一下,这确实是一个 SIGABRT,当我在寻找解决方案时,异常断点已经打开了。 - Rob Caraway
1个回答

6

应该将限制条件添加到包含子视图的父视图中。因此,如果这些对象在您的主视图中,则应具有以下代码(而不是其他任何addConstraints:行):

[self.view addConstraints:constraints];

同时,你的字典视图应该以nil结尾(我不知道这是否必要。我注意到在苹果的一个例子中他们没有这样做,但函数定义显示需要使用nil)。

你不需要为那个绑定字典宏添加nil终止符。 - jrturton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接