我正在尝试添加带有NSLayoutConstraints的UIView但是我一直收到类型NSException错误的未捕获异常。我用代码代替故事板的主要原因是我希望它在UITableViewController上的导航栏上方。
以下是我目前的代码。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let mainWindow: UIWindow = UIApplication.shared.keyWindow!
let newView = UIView()
newView.backgroundColor = UIColor.darkAqua
newView.translatesAutoresizingMaskIntoConstraints = false
mainWindow.addSubview(newView)
let viewHeight = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)
let viewWidth = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)
let viewLeft = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.left, relatedBy: NSLayoutRelation.equal, toItem: mainWindow, attribute: NSLayoutAttribute.left, multiplier: 1, constant: 40)
let viewTop = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: mainWindow, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0)
newView.addConstraints([viewHeight, viewWidth, viewLeft, viewTop])
}
如果我取出viewLeft
和viewTop
,它就会运行正常,因为toItem:
在NSLayoutConstraint
中为零。但我认为问题与toItem:
我尝试过使用self.view
和mainWindow
有关,但它一直在抛出错误。
我已经看过很多关于如何做到这一点的例子,据我所知,我几乎都在复制它们,但是没有一个是Swift 4,所以我想知道Swift 4中是否有什么变化。 / p>
任何帮助都会很棒!谢谢。
错误讯息:
libc ++ abi.dylib:以NSException类型的未捕获异常终止 (LLDB)
答案 0 :(得分:2)
我尝试使用self.view而不是主窗口,并使用不同的布局约束样式。试试这个Jason Brady。
override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = UIColor.red
newView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(newView)
newView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 40).isActive = true
newView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
newView.widthAnchor.constraint(equalToConstant: 100).isActive = true
newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
}