Objective c NSLayoutConstraints冲突

Objective c NSLayoutConstraints冲突,objective-c,nsview,nslayoutconstraint,Objective C,Nsview,Nslayoutconstraint,我试图以编程方式将按钮添加到视图中已存在的NSTextField下面的视图中。视图是在IB中创建的,并使用约束。这是一个NSTableCellView,但我怀疑这在这个案例中有什么区别。因此,我的代码是: NSView *previousView = self.pathsField; for( NSString *path in self.revision.paths ) { NSButton *pb = [[NSButton alloc] initWithFrame: bframe]

我试图以编程方式将按钮添加到视图中已存在的NSTextField下面的视图中。视图是在IB中创建的,并使用约束。这是一个NSTableCellView,但我怀疑这在这个案例中有什么区别。因此,我的代码是:

NSView *previousView = self.pathsField;

for( NSString *path in self.revision.paths )
{
    NSButton *pb = [[NSButton alloc] initWithFrame: bframe];

    pb.bezelStyle = NSRoundRectBezelStyle;
    [self addSubview: pb];
    pb.title = path;
    [self addConstraint: [NSLayoutConstraint constraintWithItem: pb
                                           attribute: NSLayoutAttributeTop
                                           relatedBy: NSLayoutRelationEqual
                                           toItem: previousView
                                           attribute: NSLayoutAttributeBottom
                                           multiplier: 1 constant: 2.0]];
    [buttons addObject: pb];
    bframe.origin.y += 20;
    previousView = pb;
}
self.pathButtons = buttons;
如果我把addConstraint调出,按钮就会毫无怨言地添加(只是不在正确的位置)。通过addConstraint调用,我在调试控制台上收到了很多关于约束冲突的消息,一些IB创建的约束被破坏


显然我做错了什么。我希望约束要求新按钮的顶部比上一个视图或按钮的底部低2 px。这似乎不应该导致任何冲突,那么我该从哪里开始呢?

您收到的错误是因为您没有通过在子视图上调用
settranslatesAutoResistingGMaskintoConstraints:
来选择autolayout

NSButton *pb = [[NSButton alloc] initWithFrame: bframe];
[pb setTranslatesAutoresizingMaskIntoConstraints:NO];

实际上,您在约束方面犯了两种可能犯的错误:您的约束既冲突又不明确!正如其他人所说,通过将
translatesAutoresizingMaskIntoConstraints
设置为“否”来消除冲突,然后开始担心歧义。只有指定布局所需的所有内容,才能成功使用约束。您正在指定顶部,但仅此而已;您还需要指定前缘(左侧),可能还需要指定宽度和高度(可能不是因为按钮有时具有固有的大小;您必须进行实验)。

右上!谢谢你的帮助。TranslatesAutoResizengMask是缺少的一位。之后,让布局正常运行就很简单了。一定要检查是否存在歧义!最好的方法是:暂停调试器,在调试器控制台的命令行中说
po[[UIWindow keyWindow]\u autolayoutTrace]
。此外,由于您也是@Matt,我觉得我可以在Matt之间向您指出,您不接受(单击问题答案之一旁边的复选框)。我不是说你应该接受我的答案(另一个答案是正确的,而且是第一个);我只是说,如果你这样做,人们会更倾向于帮助你,因为这是他们帮助你的最大动机之一。