我想将容器视图添加到主视图( rootViewController.view ),但以下内容给出了异常。我知道约束,但无法找出原因。
import UIKit
class rootViewController : UIViewController {
init() {
super.init(nibName: nil, bundle: nil)
setupLoginView()
}
func setupLoginView() {
// User ID label
let userIDLabel:UILabel = UILabel()
userIDLabel.text = "User ID"
// Password label
let passwordLabel:UILabel = UILabel()
passwordLabel.text = "Password"
// User ID text
let userIDText:UITextField = UITextField()
// Password text
let passwordText:UITextField = UITextField()
// Login button
let loginBtn:UIButton = UIButton()
loginBtn.setTitle("Login", for: .normal)
// Container view
let container:UIView = UIView()
container.addSubview(userIDLabel)
container.addSubview(userIDText)
container.addSubview(passwordLabel)
container.addSubview(passwordText)
container.addSubview(loginBtn)
view.addSubview(container)
// Add constraints
let heightConstraint = NSLayoutConstraint(item: container, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 300)
let widthConstraint = NSLayoutConstraint(item: container, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 200)
let centerXConstraint = NSLayoutConstraint(item: container, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0)
let centerYConstraint = NSLayoutConstraint(item: container, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .centerY, multiplier: 1, constant: 0)
container.addConstraint(heightConstraint)
container.addConstraint(widthConstraint)
container.addConstraint(centerXConstraint)
container.addConstraint(centerYConstraint)
}
}
提示以下异常,提示"约束是否引用了视图子树外部的内容?这是非法的"
' NSGenericException',原因:'无法在视图上安装约束。 约束是否引用了子树之外的内容 风景?这是非法的。约束:NSLayoutConstraint:0x170089830 UIView:0x12de138c0.centerX == UIView:0x12de0e650.centerX(有效)>
答案 0 :(得分:1)
使用以下行替换代码以添加中心约束:
view.addConstraint(centerXConstraint)
view.addConstraint(centerYConstraint)
您无法在container
上添加一个constaint,并引用它的超级视图。
将setupLoginView()
移至viewDidLoad
而不是init()
。
请勿忘记在控制台中删除警告,以便为所有创建的视图(容器,标签,按钮和文本视图)设置translatesAutoresizingMaskIntoConstraints
到false
。
答案 1 :(得分:1)
<强> 1。将setupLoginView()
移至viewDidLoad()
override func viewDidLoad()
{
super.viewDidLoad()
setupLoginView()
}
<强> 2。设置translatesAutoresizingMaskIntoConstraints
container
container.translatesAutoresizingMaskIntoConstraints = false
第3。将constraints
添加到相关的views
:
container.addConstraint(heightConstraint)
container.addConstraint(widthConstraint)
view.addConstraint(centerXConstraint)
view.addConstraint(centerYConstraint)
答案 2 :(得分:0)
ViewController的视图尚不存在。将setupLoginView()
来自init()
方法的呼叫移至viewDidLoad()
。
另外 - 正如@Pranav Kasetti建议的那样 - 您必须将中心约束添加到view
而不是container
。
最后但并非最不重要的是,为所有已创建的视图(包括translatesAutoresizingMaskIntoConstraints
)将false
设置为container
。
答案 3 :(得分:0)
问题是您在init方法中定义属性,但它不是ViewController
的良好入口点。您应该take a look here了解一些细节。
然后,替换
init() {
super.init(nibName: nil, bundle: nil)
由此:
override func viewDidLoad() {
super.viewDidLoad()
它应该有用。