故事板:绕过ViewController将IBOutlet连接到ViewModel / Model

时间:2019-05-16 14:07:54

标签: ios swift storyboard interface-builder iboutlet

我在Interface Builder中设计了一个相当复杂的表单,大约有20个IBOutlets。表单分为多个部分,并且是静态的。

某些部分可能已启用,而其他部分则被禁用(隐藏)。填写表单后,应用程序需要读取所有值(即IBOutlets,例如UITextField)并将其发送到服务器。

我使用多个UIStackViews设计表单的每个部分,以便可以轻松打开或关闭它们。

在与视图进行如此分离之后,具有能够反映相同顺序的模型是合乎逻辑的。

但是,我必须将所有IBOutlets链接到UIViewController子类,以平整任何层次结构。

我想要实现的是将单个“表单节模型”与特定的“视图”链接。控制器将仅负责启用/禁用该部分。表单节模型实际上将启用特定的标签和StackViews并填写表单值。

这是示例代码,我希望界面看起来像这样:

import UIKit


class AddressSection {
    @IBOutlet weak var sectionStackView: UIStackView!
    @IBOutlet weak var sectionTitleLabel: UILabel!
    @IBOutlet weak var addressTextField: UITextField!
    @IBOutlet weak var isPrimary: UISwitch!
    var isHidden: Bool {
        get {
            return sectionStackView.isHidden
        }
        set(newValue) {
            sectionStackView.isHidden = newValue
        }
    }
    init(){}
}

class NameSection {
    @IBOutlet weak var sectionStackView: UIStackView!
    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var surname: UITextField!
    var isHidden: Bool {
        get {
            return sectionStackView.isHidden
        }
        set(newValue) {
            sectionStackView.isHidden = newValue
        }
    }
    init(){}
}

class MyViewController: UIViewController {
    let name = NameSection()
    let address = AddressSection()

    override func viewDidLoad() {
        super.viewDidLoad()
        name.isHidden = false
        address.isHidden = true
    }
}

0 个答案:

没有答案