2017-08-25 71 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