必须使用延迟实例化的UI视图将子视图添加到视图控制器两次
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了必须使用延迟实例化的UI视图将子视图添加到视图控制器两次相关的知识,希望对你有一定的参考价值。
当以编程方式将一个延迟实例化的文本字段添加到我的viewcontroller时,我只能在调用view.addSubview(field)
两次时,在textview的启动中和viewDidLoad()
中使用它。删除初始化程序中的那个导致崩溃,并且删除viewDidLoad()
中的那个不会让文本字段出现。
class VC: UIViewController {
override func viewDidLoad() {
view.addSubview(textField)
view.setNeedsUpdatedConstraints)
}
lazy var textField: UITextField! = {
let field = UITextField()
field.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(field)
field.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
field.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
field.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true
field.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.1).isActive = true
return field
} ()
}
删除view.addSubview(textField)
中的viewDidLoad()
不会导致错误,但不会显示任何错误。删除初始化程序中的view.addSubview(field)
会导致崩溃,并出现以下错误:Unable to activate constraint with anchors <NSLayoutXAxisAnchor:0x600000469380 "UITextField:0x7fc931023600.centerX"> and <NSLayoutXAxisAnchor:0x600000469480 "UIView:0x7fc92f60c690.centerX"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.
为什么两个电话都必要?这会导致问题吗?这会是一个更好的方法吗?谢谢。
由于约束,您需要在textField
初始化程序中将文本字段添加为子视图。在添加视图之前,您无法设置约束。
您似乎需要调用viewDidLoad
中添加文本字段,因为没有它,从不调用惰性初始值设定项。所以你实际上不需要打电话给addSubview(textField)
。你只需要引用textField
来触发初始化器。
不相关但没有理由将textField
声明为隐式展开。
以上是关于必须使用延迟实例化的UI视图将子视图添加到视图控制器两次的主要内容,如果未能解决你的问题,请参考以下文章