簡體   English   中英

在 Swift 中動態創建 uiviewcontroller

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM