【问题标题】:Accessing Programatic View from the ViewController?从 ViewController 访问编程视图?
【发布时间】:2018-02-03 10:48:12
【问题描述】:

我正在以编程方式构建视图,但需要参考控制器中的视图来设置属性。我看不到实现这一目标的方法?

我有一个对视图的引用,因为控制器当然会初始化它,但是我无法访问属性,例如尝试self.view.textField,因为我认为我会这样做。

我如何实现这一目标?反之亦然,我该如何设置视图 textField 以使用控制器作为其代表来处理其输入?

我第一次没有使用故事板,所有这些都更简单但更混乱,感谢对这些问题的任何澄清

【问题讨论】:

  • 您需要为您的类声明属性并将对您创建的视图的引用存储在这些属性中
  • 所以在视图文件中我在类级别声明 UI,然后我可以访问它们,但在视图文件中的函数中创建实际视图?
  • 是的,就像您的对象的任何其他属性一样。就像你对@IBOutlets 所做的一样,除了你可以省略@IBOutlet
  • 谢谢,我需要初始化属性,例如 var emailTextField = UITextField() 还是 var emailTextField : UITextField?工作吗?
  • 您需要初始化它们,就像 Alexander 向您展示的那样,或者通过将它们声明为显式或隐式展开的选项,然后稍后在您的代码中分配一个值。

标签: ios swift mvvm delegates


【解决方案1】:

这很容易。

直接在 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
    }
}

然后你可以将CustomView添加到UIViewController,并访问CustomView的所有子视图。

【讨论】:

  • 但那是错误的,会破坏架构并使 VC 膨胀。您不应该在控制器中创建视图
  • 它工作正常。建筑的问题是第二个问题。您可以不在控制器中设置所有视图,而是在单独的视图中设置。然后只将一个视图(内部包含其他子视图)添加到控制器。您将可以使用这一视图访问所有子视图。
  • @jackdm 没有任何问题。这正是您通常会做的;你可以选择直接在 setupViews 这样的函数中创建 UIView 而不是使用匿名函数,但是这种方法避免了使用隐式展开的选项。如果你不在视图控制器中创建视图,你还要在哪里创建它们?
  • 你在 UIView 文件中创建它们,这样你就没有一个非常臃肿的 VC,VC 是用于控制逻辑而不是视图设计。修改后的答案看起来更像我所相信的
  • @jackdm,我更新了我的答案。是的,最好使用自定义的单独视图。但是创建视图的想法是相同的。不管他们在哪里,有多少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多