必须使用延迟实例化的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视图将子视图添加到视图控制器两次的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 将子视图添加到子视图控制器视图

如何在保留选项卡栏的同时将子视图控制器添加到选项卡式视图控制器?

将子视图添加到视图控制器时,ScrollView 不滚动

将子视图添加到 NSView 以获得类似国际象棋的网格

如何将子视图添加到另一个视图控制器?

将子视图控制器链接到情节提要中的父视图控制器