Этот репозиторий был создан для демонстрационной цели, а не для потребления. Однако, учитывая отзыв и использование этого репозитория, я начну поддерживать его здесь и приправить исправление/реализацию поднятых проблем.
MVVM ? Почему бы не MVC , который рекомендует Apple? Android делает MVP отлично, верно? Как насчет крутого шаблона гадюка ? Я считаю, что большие усилия уже были приложены, чтобы объяснить, что каждый шаблон приносит в таблицу, и поэтому идея здесь не в том, чтобы добавить к дебатам, а просто строить на вершине мнения, которое я уже сформировал: MVVM - это путь.
Как быстрый праймер к тому, что такое MVVM, это шаблон проектирования, с помощью которого ViewModel опосредует между моделью данных и представлением , которые отображаются данные, представленные ниже:

В iOS представление - это, по сути, является ViewController , а ViewModel - это объект (структура), который предоставляет точные данные для представления для рендеринга.
Это обеспечивает слабосвязанную архитектуру, которая поддерживается (очень тонкие контроллеры) и тестируемая (ViewModel выпускает пользовательский интерфейс и, следовательно, легко проверяется)
Тем не менее, есть предостережение: классический MVVM позволяет легко (и прекрасно) с одной ответственностью (и красиво) в случае моделей в качестве доменных моделей. Тем не менее, в случае анемичных моделей (что, как правило, так, когда у вас есть хорошо написанные API REST), также потребуется другой посредник или докладчик, который облегчает данные и навигационную поток.
Теперь, View Model несет ответственность за обновление View, а также получает обновления из просмотра относительно изменений, внесенных пользователем. Это может быть достигнуто с помощью минимального кода с использованием двунаправленного привязки данных. Но ... iOS не имеет двухстороннего механизма связывания, доступного из коробки!
К счастью, у нас есть реактивные библиотеки, такие как RXSWIFT, RXCOCOA, но они слишком тяжелые, учитывая, что двустороннее связывание является очень крошечной частью парадигмы реактивного программирования. SimpleTwowayBinding стремится обеспечить всего двухстороннее привязку, простой скромным образом!
Чтобы запустить пример проекта, клонируйте репо, и сначала запустите pod install из Directory Directory.
import SimpleTwoWayBinding
struct FormViewModel {
let name : Observable < String > = Observable ( )
let companyName : Observable < String > = Observable ( )
let yearsOfExperience : Observable < Double > = Observable ( )
let isCurrentEmployer : Observable < Bool > = Observable ( false )
let approxSalary : Observable < Float > = Observable ( )
let comments : Observable < String > = Observable ( )
}Свойства, которые вы хотите быть «привязанными» к представлению, должны быть объявлены как наблюдаемые.
class ViewController : UIViewController {
@ IBOutlet weak var nameField : UITextField !
@ IBOutlet weak var companyField : UITextField !
@ IBOutlet weak var isCurrentEmployerSwitch : UISwitch !
@ IBOutlet weak var yearsOfExperienceStepper : UIStepper !
@ IBOutlet weak var salaryRangeSlider : UISlider !
@ IBOutlet weak var selectedSalaryRangeLabel : UILabel !
@ IBOutlet weak var selectedYearsOfExperienceLabel : UILabel !
var viewModel : FormViewModel !
override func viewWillAppear ( _ animated : Bool ) {
super . viewWillAppear ( animated )
self . navigationItem . title = " Survey Form "
setupBindings ( )
}
func setupBindings ( ) {
nameField . bind ( with : viewModel . name )
companyField . bind ( with : viewModel . companyName )
isCurrentEmployerSwitch . bind ( with : viewModel . isCurrentEmployer )
yearsOfExperienceStepper . bind ( with : viewModel . yearsOfExperience )
salaryRangeSlider . bind ( with : viewModel . approxSalary )
selectedSalaryRangeLabel . observe ( for : viewModel . approxSalary ) {
[ unowned self ] ( _ ) in
self . selectedSalaryRangeLabel . text =
self . viewModel . getSalaryString ( )
}
selectedYearsOfExperienceLabel . observe ( for : viewModel . yearsOfExperience ) {
[ unowned self ] ( _ ) in
self . selectedYearsOfExperienceLabel . text =
self . viewModel . getExperienceString ( )
}
}
} Метод bind на uicontrol организует двустороннее связывание с наблюдаемым. Это весь код, который необходим для работы формы. Смотрите ниже снимок экрана.
SimpleTwowayBinding доступен через кокопод. Чтобы установить его, просто добавьте следующую строку в свой Podfile:
pod 'SimpleTwoWayBinding' Manish Katoch, [email protected]
SimpleTwowayBinding доступен по лицензии MIT. Смотрите файл лицензии для получения дополнительной информации.