2017-08-25 88 views
0

以編程方式構建我的視圖,但需要參考我的控制器中的視圖來設置屬性。我不能看到一種方法來實現這一目標?從ViewController訪問Programatic視圖?

我有一個參考視圖,當然控制器在它,但然後我不能訪問屬性,例如嘗試self.view.textField作爲身份證以爲我會。

我該如何做到這一點?反之亦然,我該如何做一些事情,比如設置視圖textField來使用控制器作爲它的委託來處理它的輸入?

第一次香港專業教育學院不使用情節串連圖板,其中這一切簡單,但混亂,欣賞在這些問題上

+0

您需要爲您的類聲明屬性並存儲對在這些屬性中創建的視圖的引用 – Paulw11

+0

因此,在視圖文件中,我在類級別聲明瞭UI,然後我可以訪問它們,但創建實際視圖在視圖文件中的功能? – jackdm

+0

是的,就像你物體的任何其他屬性一樣。就像你會用'@ IBOutlet's,除了你可以省略'@ IBOutlet'位 – Paulw11

回答

0

這很容易任何澄清。

直接在UIViewController中初始化您的UI元素。

例如:

private let yourLabel: UILabel = { 
     let label = UILabel() 
     label.text = "Text" 
     label.translatesAutoresizingMaskIntoConstraints = false 
     return label 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupViews() 
    } 

    private func setupViews() { 
     view.addSubview(yourLabel) 
     // Setup constraints for yourLabel 
    } 

然後訪問yourLabel任何位置在控制器的代碼。它適用於所有的UI組件。

注意!

您可以設置所有視圖不在控制器中,但在一個單獨的視圖。然後向控制器添加一個視圖(其中包含其他子視圖)。您將可以使用這一個視圖訪問所有子視圖。但是你如何在不同的視圖中創建UI組件的方式是相同的:

 let yourSubView: UILabel = { // any UI component 
     let label = UILabel() 
     label.translatesAutoresizingMaskIntoConstraints = false 
     return label 
    }() 

定製的實例分開UIView

class CustomView: UIView { // Separate view. Doesn't make the controller massive 

    let yourSubView: UILabel = { // any UI component 
     let label = UILabel() 
     label.translatesAutoresizingMaskIntoConstraints = false 
     return label 
    }() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     setupViews() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    public func setupViews() { 
     addSubview(yourSubView) 
     // Setup yourSubView constraints 
    } 
} 

那麼你可以添加CustomViewUIViewController和訪問所有的子視圖CustomView

+0

但這是錯誤的,並打破體系結構和膨脹VC。你不應該在控制器中創建你的視圖 – jackdm

+0

它工作正常。第二個問題是架構問題。您可以將所有視圖設置爲不在控制器中,但是在單獨的視圖中。然後向控制器添加一個視圖(其他子視圖)。您將可以使用這一個視圖訪問所有子視圖。 –

+2

@jackdm它沒有問題。這正是你通常會做的;你可以選擇直接在像'setupViews'這樣的函數中創建UIView,而不是使用匿名函數,但是這種方法避免了使用隱式解包的optionals。如果您沒有在視圖控制器中創建視圖,那麼您還要在哪裏創建它們? – Paulw11

相關問題