“NSInvalidArgumentException”的,理由是:“无法解析约束格式”('

2019-08-01 20:36发布

我有我想要的旋转屏幕期间保持停止子视图,所以我决定把NSLayoutConstraint类型:

尾随空格到上海华
顶层空间,以上海华
按键空间,以上海华
我在的UITableViewCell的子类。 我写的代码,但我得到了以下错误:

'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 
 self is not a key in the views dictionary. 
 H:[self.arrows]-5-|


我在CustomCell.m代码是:

 self.arrows = [[Arrows alloc]initWithFrame:CGRectMake(self.contentView.bounds.size.width-30, self.bounds.origin.y+4, 30, self.contentView.bounds.size.height-4)];

 NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self.arrows, self.contentView);
 NSMutableArray * constraint=[[NSMutableArray alloc]init];
 [constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:  [self.arrows]-5-|" options:0 metrics:nil views:viewsDictionary]];
 [constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-1-[self.arrows]" options:0 metrics:nil views:viewsDictionary]];
 [constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[V: [self.arrows]-1-|" options:0 metrics:nil views:viewsDictionary]];
 [self.arrows addConstraints:constraint];

Answer 1:

它看起来像的自动版式视觉格式解析引擎的解释“像它的使用您的VFL约束是一个的keyPath,而不是关键” . valueForKeyPath:

NSDictionaryOfVariableBindings(...)将采取一切你的参数是在括号,并把它翻译成与该对象的值的文本键值(在你的情况: @{"self.arrow" : self.arrow} 在VFL的情况下,自动布局被认为你有一个关键名为self在你看来字典使用具有的关键一子词典(或子对象) arrow

@{
   @"self" : @{ @"arrow" : self.arrow }
}

当你从字面上希望系统解释为“你的钥匙self.arrow ”。

通常,当我使用一个实例变量的getter这样的,我通常最终会创造我自己的字典,而不是使用的NSDictionaryOfVariableBindings(...)如下所示:

NSDictionary *views = @{ @"arrowView" : self.arrow }

要么

NSDictionary *views = NSDictionaryOfVariableBindings(_arrow);

这将允许您使用视图在VFL没有自我,你还知道你在说些什么:

NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[arrowView]-5-|" options:0 metrics:nil views];

要么

NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[_arrow]-5-|" options:0 metrics:nil views];

作为一般规则,我已经学会不与一个点(字典的键. )在他们以避免任何混淆系统或调试的噩梦。



Answer 2:

我的诀窍是简单地声明一个局部变量,这只是另一个指针的财产,并把它放在NSDictionaryOfVariableBindings

@interface ViewController ()
@property (strong) UIButton *myButton;
@property (strong) UILabel *myLabel;
@end

...

UIButton *myButtonP = self.myButton;
UILabel *theLabelP = self.myLabel;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(myButtonP, myLabelP);

P的后缀是“指针”。



Answer 3:

最简单的办法是避免了变量的getter从自己的类和超局部变量重新定义变量。 a。对于例如解决方案

UIView *contentView = self.contentView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_arrows, contentView);


Answer 4:

请确保您添加的约束添加所需的子视图到主view.It后,花了一段时间得到有关这一问题的知识。



文章来源: 'NSInvalidArgumentException', reason: 'Unable to parse constraint format'