我想动态创建UIViewController而不创建类或使用Mainstoryboard.我希望它以编程方式发生.这可能吗?
我想根据动态数据创建UIViewControllers.
我想根据动态数据创建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技术,并且必须自己实例化并加载视图属性.