[英]Creating uiviewcontroller dynamically in Swift
我想在不创建类或使用 Mainstoryboard 的情况下动态创建 UIViewController。我希望它以编程方式发生。这可能吗? 我想根据动态数据创建 UIViewControllers。
是的,您可以以编程方式动态创建视图。 我知道你说过你不想使用类,但你真的必须这样做。 不过,关键是您不必让此类对 UI 进行硬编码,而是动态构建它。
因此,您可以UIViewController
,但将动态构建视图所需的数据传递给它,然后实现loadView
方法来执行此操作。 不需要 NIB 或故事板场景。 只需根据您的动态数据创建view
并构建子视图。 这在旧版视图控制器编程指南中有所描述。 (请注意,该文档的部分内容不再适用,特别是所有“卸载”视图讨论。但它确实描述和说明了loadView
过程,该过程仍然可以正常工作。)
为视图控制器构建视图的过程如下:
如您所见,其中一个路径(自定义loadView
方法)绕过了情节提要/NIB 工作流。 请注意,如果您执行此过程,您将负责实例化UIView
对象并设置视图控制器的view
属性。 另外,不要叫super.loadView()
在您的实现。
例如,如果我只想向视图添加一堆UILabel
对象,在 Swift 3 中,您可以执行以下操作:
class ViewController: 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 版本,请参阅此答案的先前修订版。)
话虽如此,我不确定您为什么担心不使用 NIB 或故事板。 只用一个空白的。 然后,您可以再次以编程方式将控件动态添加到场景中,但在viewDidLoad
。 它实现了与上述完全相同的效果,但避免了使用相当陈旧的loadView
技术,也避免了必须自己实例化和加载view
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.