Я давно разрабатываю iOS-приложения в рамках архитектуры MVVM, и каждый раз, когда я начинаю новый проект, я стараюсь сократить расстояние между «идеальным» MVVM и моим MVVM.
На этот раз я попытаюсь приблизиться к тому, что увидел, когда искал оригинальные приложения MVVM в WPF. Я заметил, что есть два основных игрока: свойства ViewModel, которые представляют состояние View, и команды, выполнение которых запускается из View и обрабатывается в контексте ViewModel.
В этой статье мы попробуем создать нечто подобное, используя мой любимый фреймворк привязки iOS Bond.
Во-первых, давайте взглянем на наш простой контроллер представления в его исходной форме (я настроил его в раскадровке):
В этом представлении пользователь введет имя в текстовое поле, нажмет кнопку «Скажи привет», после чего метка приветствия обновит свой текст.
Понятно, что ViewModel представления должен иметь два свойства (имя, приветствие) и одну команду. (скажи привет).
Таким образом, ViewModel в исходном виде будет таким:
Теперь давайте преобразуем все это в обычный вид MVVM. Мы сделаем свойства Observable и привяжем к ним метку и текстовое поле. Также мы привяжем нажатие кнопки к вызову функции sayHello.
Проверьте суть ниже
Вроде все нормально и так и есть на самом деле, но как я уже говорил должен быть Command player. Здесь команда, очевидно, sayHello, но она представлена как простая функция, которая вызывается из View. Было бы лучше описать эту функцию как свойство ViewModel, чтобы мы могли связать нажатие кнопки с ней одной строкой кода.
Давайте объявим простой командный протокол.
Команда должна иметь возможность привязать сигнал к себе и выполнить некоторую логику в ответ на сигнал.
Давайте создадим конкретную реализацию этого протокола. Мы объявим класс, который будет инициализироваться с закрытием действия, и выполним его в функции выполнения.
Теперь давайте обернем нашу функцию sayHello в sayHelloCommand:
Теперь пришло время привязать нажатие кнопки к этой команде. Одна изящная строка вместо трех… Обратите внимание на строку номер 20:
Вот и все! Давайте создадим и запустим наше приложение:
Есть гораздо больше типов команд, которые вы можете создать, просто погрузитесь в них.
Спасибо за чтение!
Существует также версия проекта Combine framework: посмотрите ветку Combine-framework: https://github.com/IsaAliev/MVVM-Properties-and-Commands/tree/combine-framework
Гутхаб: