以编程方式添加NSLayoutConstraint,崩溃

时间:2015-02-09 06:06:59

标签: ios objective-c nslayoutconstraint

我有一个应用程序,我正在尝试将NSLayoutConstraint应用于视图内的项目。这是我的代码:

[customCell.infoView addConstraints:[NSLayoutConstraint 
          constraintsWithVisualFormat:@"H:|-0-[customCell.infoLabel]-0-|" 
         options:0 metrics:nil views:NSDictionaryOfVariableBindings(customCell.infoView)]];

我不知道这意味着什么,但它因以下错误而崩溃:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 
customCell is not a key in the views dictionary. 
H:|-0-[customCell.infoLabel]-0-| 

以下是错误的屏幕截图:

enter image description here

注意infoLabel末尾的插入符号。

是的,我确实有customCell.m。 (我在这个.m文件中使用了其他对象)。

更新

以下是我在customCell.m

awakeFromNib中插入的当前代码
[self.contentView addConstraints:[NSLayoutConstraint
                                      constraintsWithVisualFormat:@"H:|[_infoLabel]|"
                                      options:0 metrics:nil views:NSDictionaryOfVariableBindings(_infoLabel)]];
[self.contentView addConstraints:[NSLayoutConstraint
                                      constraintsWithVisualFormat:@"V:|[_infoLabel]|"
                                      options:0 metrics:nil views:NSDictionaryOfVariableBindings(_infoLabel)]];

在上面的屏幕截图中出现了同样的错误。

更新2

现在崩溃时出现以下错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSDictionaryOfVariableBindings failed because either one of the values is nil, or there's something wrong with the way the macro is being invoked.  Cannot assign value nil for key "_infoLabel". Keys:(

    "_infoLabel"

2 个答案:

答案 0 :(得分:0)

这不是你的错。

视图字典的工作方式有点怪异;它会识别"。"作为keyPath。

(丑陋)解决方案:

将customCell.infoView分配给另一个视图对象并在视图字典中使用

即。 UIView newInfoView = customCell.infoView;

答案 1 :(得分:0)

您的代码应该位于自定义单元格的.m文件中,然后您可以将视图称为_infoView(您还在一个地方使用infoLabel而在另一个地方使用infoView)。你的约束也是错误的。约束应该添加到infoView的superview,而不是infoView。您还需要一些垂直约束。

[self.contentView addConstraints:[NSLayoutConstraint 
          constraintsWithVisualFormat:@"H:|[_infoLabel]|" 
         options:0 metrics:nil views:NSDictionaryOfVariableBindings(_infoLabel)]];