ios – 在Swift中动态创建uiviewcontroller

我想动态创建UIViewController而不创建类或使用Mainstoryboard.我希望它以编程方式发生.这可能吗?
我想根据动态数据创建UIViewControllers.

解决方法

是的,您可以通过编程方式动态创建视图.我知道你说你不想上课,但你真的必须这样做.但关键是,您不必将此类硬编码为UI,而是动态构建它.

因此,您可以继承UIViewController,但是将动态构建视图所需的数据传递给它,然后实现loadView方法.不需要NIB或故事板场景.只需创建视图并根据动态数据构建子视图.这在遗留的View Controller Programming Guide中有所描述.(请注意,该文档的某些部分不再适用,尤其是“卸载”视图讨论.但它确实描述并说明了loadView进程,它仍然可以正常工作.)

构建视图控制器视图的过程如下:

如您所见,其中一个路径(自定义loadView方法)绕过了storyboard / NIB工作流程.请注意,如果您执行此过程,则您负责实例化UIView对象并设置视图控制器的视图属性.另外,不要在实现中调用super.loadView().

例如,如果我想在视图中添加一堆UILabel对象,在Swift 3中你可以做类似的事情:

class DynamicViewController: UIViewController {

    var strings: [String]!

    override func loadView() {
        // super.loadView()   // DO NOT CALL SUPER

        view = UIView()
        view.backgroundColor = .lightGray

        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical
        view.addSubview(stackView)

        NSLayoutConstraint.activate([
            stackView.centerXAnchor.constraint(equalTo: view.centerXAnchor),stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])

        for string in strings {
            let label = UILabel()
            label.translatesAutoresizingMaskIntoConstraints = false
            label.text = string
            stackView.addArrangedSubview(label)
        }
    }
}

你可以像这样呈现它:

@IBAction func didTapButton(_ sender: AnyObject) {
    let controller = ViewController()
    controller.strings = ["Hello world","Foobar","Baz"]
    show(controller,sender: sender)
}

(对于Swift 2的再现,见previous revision of this answer.)

话虽如此,我不确定你为什么不关心不使用NIB或故事板.只需使用空白的.然后,您可以再次以编程方式动态地将控件添加到场景中,但在viewDidLoad中执行此操作.它实现了与上面完全相同的效果,但避免使用相当陈旧的loadView技术,并且必须自己实例化并加载视图属性.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...