NSLayoutConstraint `视图不是视图字典中的键`

NSLayoutConstraint `view is not a key in the views dictionary`

简介:

是的,我已经查看了与该主题相关的所有问题,none 的答案有所帮助。下面的代码不断向我抛出 NSInvalidArgumentException 异常,我仍然看不出它有什么问题。

问题:

我已经尝试了所有可能的尝试。它仍然像往常一样崩溃并显示相同的错误消息,即; 'Unable to parse constraint format: sceneView is not a key in the views dictionary.'.

这是我的做法:

- (SCNView *)sceneView { // Lazy Load
  if (_sceneView == nil) {
    _sceneView = [[SCNView alloc] initWithFrame:self.bounds];
    _sceneView.backgroundColor = [UIColor blackColor];
    _sceneView.scene = self.scene; // Load scene
    _sceneView.translatesAutoresizingMaskIntoConstraints = NO;

  }
  return _sceneView;
}

然后在-(void)commonInit里,我加上:

if ([self.sceneView isDescendantOfView:self] == NO) {
    [self addSubview:self.sceneView];
  }

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

紧接着,它异常终止。为什么?

实际上,NSDictionaryOfVaribaleBindings 是一个宏

_NSDictionaryOfVariableBindings(@"" # VA_ARGS, VA_ARGS, nil),

您使用的变量将与代码中的变量相同,因此您将获得 @{"self.sceneView" :self.sceneView} 的 NSDictionary,您需要更改为类似 @"H:|[self.sceneView]|" 让它工作。

使用自我。只是为了调用一个 returns 对象的方法,它不是你可以用作键的东西,你做错了。使用以下方式,它将解决您的崩溃问题:

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