NSGenericException“理由是:”无法在视图安装约束(NSGenericExcepti

2019-07-19 18:21发布

终止应用程序由于未捕获的异常“NSGenericException”

终止应用程序由于未捕获的异常“NSGenericException”,理由是:“无法在视图安装约束。 是否从该视图的子树外的约束参考的东西吗? 这是非法的。 约束:观点:; 层=; contentOffset:{0,0}>”

Answer 1:

你需要在这两种视图“更高”安装约束。 做一个很好的,一般的方式是这样的:

NSLayoutConstraint* constraint = ...;
NSView* firstView = constraint.firstItem;
NSView* secondView = constraint.secondItem;    
[[firstView ancestorSharedWithView: secondView] addConstraint: constraint];

只是提醒一句:这是很好的位置记住,约束属性在其上加入他们的观点的背景下进行评估。 因此,例如,viewA的NSLayoutAttributeLeft的价值,为安装在viewB一个约束,也是解释viewB的坐标空间。 对于仅引用兄弟姐妹观点或他们的上海华限制,这一事实在很大程度上是不相关的,但没有限购令的约束不能引用不属于兄弟姐妹或父母直接两种观点。



Answer 2:

类似neoneye我得到这个因与约束删除子视图。 但是我有被定位父视图的约束,并且如果我称这种正在除去[self.view removeConstraints:self.view.constraints]; 相反,我做了这个变化,

原始代码:

for (UIView *subview in [view subviews]) {
    [subview removeFromSuperview];
}

固定于子视图删除约束:

NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ;
for( NSLayoutConstraint * constraint in view.constraints) {
    if( [view.subviews containsObject:constraint.firstItem] ||
       [view.subviews containsObject:constraint.secondItem] ) {
        [constraints_to_remove addObject:constraint];
    }
}
[view removeConstraints:constraints_to_remove];

for (UIView *subview in [view subviews]) {
    [subview removeFromSuperview];
}

更新 :所以我又打这个错误-它是由于删除这段时间的单一视图。 新增了一个功能,彻底移除的观点:

void cleanRemoveFromSuperview( UIView * view ) {
  if(!view || !view.superview) return;

  //First remove any constraints on the superview
  NSMutableArray * constraints_to_remove = [NSMutableArray new];
  UIView * superview = view.superview;

  for( NSLayoutConstraint * constraint in superview.constraints) {
    if( constraint.firstItem == view ||constraint.secondItem == view ) {
      [constraints_to_remove addObject:constraint];
    }
  }
  [superview removeConstraints:constraints_to_remove];

  //Then remove the view itself.
  [view removeFromSuperview];
}


Answer 3:

我经历了iOS6的这个错误。 在我的情况,那是因为我开始不先消除限制移除子视图。

// I had forgotten to remove constraints first. This caused the crash.
[self.view removeConstraints:self.view.constraints];

NSArray *subviews = self.view.subviews;
for (UIView *subview in subviews) {
    [subview removeFromSuperview];
}

[self addYourSubviewsHere];


Answer 4:

我用像的UITextField(使用自动布局)输入一个UIPickerView这个问题。 当我把另一个的viewController,从而弹出它到ViewController与选择器,应用程序崩溃。 我发现下面的解决方案,在UIPickerViewController:

-(void)viewWillAppear:(BOOL)animated{

    [self.pickerView removeFromSuperview];
    [self.pickerView setTranslateAutoresizingMaskIntoContraints:YES];
    [self.view addSubview];

}   

您也可以从上海华盈取出后设置UIPickerViewPosition。 我希望能帮助你!



Answer 5:

我发现加入这一行代码修复了这个问题的可可滚动型。

[scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];

我认为某些视图在运行时添加的限制,因此,当您通过Objective C中添加自己的,所以你需要禁用此行为发生冲突......



Answer 6:

同样的错误,不同的解决方案在这里:

我上添加一个新的观点,忘记关掉后,开始了我在iOS 6应用此错误Use Auto Layout就可以在界面生成器......我恨它有没有标准设置默认情况下新使用自动布局意见...



Answer 7:

我有同样的崩溃,它原来是一个浮点精度问题约束乘数值。 我将我所有的约束乘数不错浮点值(例如0.375,而不是0.35)和固定的崩溃。

自动版式:removeFromSuperview / removeConstraints抛出异常和崩溃硬



文章来源: NSGenericException', reason: 'Unable to install constraint on view