Лекция 10 CS193P Spring 2020 — Модальное представление и Навигация.

На Лекции 10 курса Стэнфорда  CS193p — «Developing  Application for iOS» («Разработка приложений для iOS») Пол Хэгерти показывает очень большой демонстрационный пример, почти полностью посвященный темам, относящимся к представлению Views на экране. 

В некотором смысле мы уже знаем, как это можно делать. ForEach выводит Views на экран и убирает с экрана. А также if-elses внутри @ViewBuilders заставляет Views появляться и уходить с экрана. Но на Лекции 10 мы будем говорить о больших группировках Views, Views, которые могут занять весь экран полностью, Views, которые могут управляться своими собственными MVVMs. Мы еще не видели приложений, у которых есть множество ViewModels. Но, конечно, большинство больших программ имеют много ViewModels.

Темы демонстрационного примера Лекции 10:

  • .sheet
  • .popover
  • TextField
  • Form
  • Больше об “Ограничениях и Выгодах” (Constraints and Gains) через улучшение Grid.
  • Удаление с экрана модально представленных Views через @Binding.
  • Множество MVVM в одном приложении.
  • Hashable и Equatable
  • NavigationView + NavigationLink + .navigationBarTitle / Items
  • Alerts
  • Уничтожение в ForEach с помощью .onDelete
  • EditButton
  • EditMode @Environment переменная (@Binding)
  • Установка @Environment переменных 
  • .zIndex

Начинается лекция с простого вопроса: «Как инициализировать @State переменную?» Этот вопрос в больших количествах встречается в StackOver и профессор дает нам два ответа на этот вопрос.

Далее рассматривается .popover и его адаптация на iPhone. В .popover отлично показана работа с @Binding, если нужно «привязать» @State, и с @EnvironmentObject, если нужно привязать ViewModel. Потому что модальные Views типа .popover или .sheet получают свой собственный Мир для “жизни” и вы должны передать в этот Мир ViewModel только через @EnvironmentObject.

При работе с TextField опять возникает взаимодействие @State с @Binding, но приходится решать установку начального значения @State , которая решается в данном случае с помощью модификатора .onAppear, но может решаться и указанным в начале Лекции 10 способом.

Далее рассматривается использование формы Form, что привело к необходимости расширить возможности нашей «сетки» Grid на то, чтобы заставить ее работать не только с Identifiable. Это достигается механизмом “Ограничениях и Выгодах” (Constraints and Gains), который работает с Generic, на которые накладываются ограничения в виде протоколов, что приводит к дополнительным возможностям этих Generic. Это очень увлекательная часть лекции.

Тема Навигации в лекции изложена предельно понятно и кратко.

Самая сногсшибательная в прямом смысле тема — это @Environment переменные и в частности такая особенная @Environment переменная как editMode, которая является Binding <EditMode> и которую необходимо устанавливать, чтобы определить режим редактирования View. На лекции показаны все нюансы её использования, которые вы не найдете ни в документации, ни в каких обучающих курсах. 

Ну и отдельное спасибо профессору за вариант приложения Emoji Art для SwiftUI 2.0 с использованием нового шаблона документо- ориентированных приложений DocGroup.

Код демонстрационного примера для Лекции 10 находится на сайте курса CS193P и на Github для iOS 13 в папке Memorize L10.

Русскоязычный неавторизованный конспект Лекции 10, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также в формате Google Doc доступны на платной основе.