[英]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.