В iOS есть MVC встроенный в CocoaTouch – там у всего delegates и data sources. Обычный iOS разработчик на Obj-C/Swift будет их напрямую цеплять к модели данных – запросам к БД, в сеть и т.д.
И на нативном iOS UI state будут хранить внутри прямо UI параметров как например, somBtn.enabled = false
. Чтобы сделать MVVM (будь то C# или нативные языки), нужно добавить прослойку ViewModel и хранить UI state в ней: someBtn.enabled = ViewModel.SomeBtnEnabled
.
Когда делаешь это c каким фреймворком с bindings, они берут на себя обновление (two-way, one-way bindings): поменялось в VM, меняется и UI. Если делать без них – придётся руками вбивать getters и setters. Если интерфейс не тяжёлый, то для обновления View из ViewModel делаешь метод в каждом iOS view Controller типа UpdateView()
и там пробегаешь по всем элементам интерфейса, подхватывая в них данные из ViewModel. ViewModel шлёт оповещение (она не знает ничего о View) что нужно обновиться и View в одном методе всё обновляет.
Когда нужно из View обновить данные во ViewModel, то просто используешь айосные delegates и из них напрямую обращаешься к полям VM текущего View.
Чтобы сделать VM на уровне проекта, посмотри простые примеры типа Playgrounds в MvvmCross – брать его необязательно, но станет понятнее как они делят код чтобы можно было переиспользовать.
Вкратце, там Solution на несколько проектов: в центре всего "Core" проект библиотеки на .NET Standard 2.0 которую на каждой платформе использует проект этой платформы. Model и ViewModel слои в этой библиотеке, поэтому она независима от платформы и ничего не знает ни про CocoaTouch/UIKit, ни про Android SDK. Там чистые данные, но подготовленные так чтобы интерфейсу было легко их подхватить.