При следовании шаблону проектирования MVC какой код должен быть в файле класса UIViewController?- Swift4 - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь понять, как правильно реализовать MVC в Swift.Вот мой сценарий:

У меня есть страница регистрации с 9 UITextFields, и все они создаются программно, и, следовательно, программно привязываются к представлению.Как вы можете себе представить, это будет много повторяющегося кода в файле класса SignupViewController.

Является ли условием, что после MVC, сохранять настройки этих текстовых полей в файле SignupViewController, или вы должны иметь отдельный файл, такой как SignupView, который содержит весь код установки текстового поля?

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

После прочтения рекомендаций по написанию поддерживаемого и читабельного кода вы должны сделать весь дизайн в конструкторе интерфейсов. Если вы хорошо понимаете ограничения, вам не нужно писать код для настройки дизайна в вашем контроллере представления. Файл ViewController.swift не должен использоваться для выборки-обработки данных или для настройки пользовательского интерфейса. Он должен просто отвечать за отображение и обновление значений, которые выбираются и обрабатываются в отдельном файле ViewControllerDatasource.swift. Таким образом, чтобы подвести итог, контроллер представления не имеет никакой реализованной логики, он просто обрабатывает данные шоу и обновления дизайна (не настройки). Я надеюсь, что помог вам с вашим вопросом.

0 голосов
/ 13 сентября 2018

Несмотря на то, что в UIViewController есть слово «controller», я считаю, что большинство разработчиков iOS в настоящее время назначают UIViewController стороне MVC «Вид». UIViewController в основном относится только к конкретному представлению, плюс может также управлять его подпредставлениями (пока это не станет слишком запутанным, и не добавится контейнерное представление, позволяющее использовать вложенный UIViewController).

В MVC на iOS контроллер представления может быть легко загрязнен бизнес-логикой, управлением моделью и т. Д., Поэтому многие люди в шутку называют «MVC» в iOS как «Massive View Controller». Чтобы бороться с этим, рассмотрите возможность использования архитектуры MVVM вместо этого, которая не только сохраняет VC небольшими, но и перемещает бизнес-логику в отдельную «коляску», связанную с этим ViewController, которая называется ViewModel. Это позволяет проводить модульное тестирование бизнес-логики без участия пользовательского интерфейса, что делает тестирование намного более надежным, его легче читать и обслуживать. С учетом сказанного, создание этих 9 элементов управления по-прежнему будет принадлежать ViewController.

Что касается программного добавления UITextFields к вашему представлению против viewController, если это нужно сделать только для этой отдельной сцены, я бы вставил его в viewController. Если вы ожидаете, что захотите повторно использовать их набор в других сценах, то создание пользовательского представления или элемента управления, содержащего их, было бы лучше, как это обычно делается для пользовательских ячеек таблицы.

Наконец, попробуйте просто использовать перо или раскадровку для макета вашей сцены. Apple предоставила настолько много возможностей для компоновки и поддержки сцен с помощью перьев и раскадровок, что вы действительно упускаете возможность пойти по программному пути. Я нахожу очень редким, что я на стороне программного подхода. Предупреждения об автоматической компоновке в одном только InterfaceBuilder стоят для меня золота, и, поскольку Apple продолжает поднимать планку и менять правила компоновки, я не могу представить, что пытаюсь идти в ногу с программным обеспечением, когда не могу позволить себе тестировать каждое устройство и версию iOS сочетание. И да, возможно сделать MVVM с внедрением зависимостей и раскадровками. Я делаю это ежедневно.

0 голосов
/ 13 сентября 2018

Я не согласен с приведенным выше утверждением об использовании Interface Builder ... Я предпочитаю писать большинство своих представлений в коде, а также устанавливать привязки таким же образом.

, чтобы минимизировать файл, вы можете создать расширение ViewController в отдельном файле, чтобы содержать весь этот код.

так что для RegistrationViewController вы должны создать новый файл с именем RegistrationViewController + SetupUI.swift.

import UIKit

extension SignupViewController {
    // add your setup methods here

    // as just an FYI you can call the methods you create from your
    // SignupViewController file just like you would any other method.
}

Вы можете узнать больше о расширениях здесь .

0 голосов
/ 13 сентября 2018

Ответ на ваш вопрос в том, что он не имеет ничего общего с MVC.

Как разработчики iOS / Mac, мы используем Interface Builder и auto_layout для достижения большинства UI @ IBOUtlet / @IBAction. Это V сторона MVC.

Как правило, если у вас есть данные, база данных, json или любой другой формат, вам нужно смоделировать их и обработать логику. Это ММК.

Сторона C (Controller) MVC является своего рода связующим звеном между M и V. В большинстве случаев для мобильных устройств вы можете думать, что все контроллеры - это C, которые вам нужны.

Таким образом, класс контроллера - это единственная часть, в которую нужно поместить код, чтобы все упростить.

В вашем случае, 9 UITextfields должны быть идеально вставлены в задание на V стороне. Пожалуйста, не пишите код для них, если нет лучшего способа сделать это.

...