Раскадровка: подключите IBOutlet к ViewModel / Model в обход ViewController - PullRequest
0 голосов
/ 16 мая 2019

У меня есть довольно сложная форма, разработанная в Интерфейсном Разработчике, имеющая около 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
    }
}
...