微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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技术,并且必须自己实例化并加载视图属性.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐