В Лекции 8 рассматриваются две главные темы. Первая тема — это “жизненный цикл” View Controller, то есть как View Controller рождается, живет, делает много интересных дел и затем умирает. Профессор подробно рассказывает нам о всех этапах жизни View Controller и о том, какие сообщения посылает ему система на протяжении его «жизненного цикла». Он начинает с момента создания View Controller, затем следует подготовка View Controller для того случая, когда к этому View Controller кто-то “переезжает” (segue). Следующий этап — установка ваших outlets, затем ваш View Controller появляется (appear) на экране и может исчезнуть (disappear), и может опять появиться, и опять исчезнуть. Затем его геометрия может быть изменена , например, при автоматическом вращении (autorotation) прибора или еще по каким-то другим причинам. В некоторых неочевидных случаях может иметь место ситуация нехватки памяти на вашем устройстве, и система может вовлечь вас в решение этой проблемы.
Он не просто перечисляет такие методы «жизненного цикла» View Controller, как viewDidLoad, viewWillAppear и viewDidAppear, viewWillDisappear и viewDidDisappear, viewWillLayoutSubviews и viewDidLayoutSubviews,
viewWillTransitionToSize и другие, но также очень подробно рассказывает о том, в каких ситуациях их нужно применять, а в каких воздержаться от их использования.
Профессор проводит короткую, но очень информативную демонстрацию, на которой показано, как «в живую» работают все методы «жизненного цикла» View Controller.
Затем раскрывается вторая важная тема этой лекции — механизм Autolayout (автоматическая разметка). Дается обзор того, что нам уже известно об Autolayout к этому моменту времени, так как во всех предыдущих лекциях элементы Autolayout были представлены в той или иной степени. В связи с тем, что в iOS 8 выдвинута новая концепция «Адаптивного интерфейса», и появилось понятие Size Class, роль механизма Autolayout сильно возросла.
Далее в лекции приводятся два больших демонстрационных примера, ибо систему Autolayout лучше увидеть, чтобы понять ее. Лектор открывает все тонкости работы с Autolayout, действуя как факир по укрощению такого «зверя» как Autolayout. Надо честно сказать, что разработчики держатся до последнего, чтобы не использовать Autolayout, потому что несмотря на то, что это очень мощная система, приемы работы с ней недостаточно освещены в документации и требуется большая практика. Это способствует некоторой ее мистификации. Но в iOS 8 без нее уже не обойтись. Профессор рассказывает об Autolayout настолько увлекательно, что это похоже на просмотр детектива, и ты все время гадаешь, а как все-таки ему удастся победить такого «зверя», как Autolayout? Но он открывает перед вами все новые и новые приемы работы с Autolayout, иногда очень креативные. Довольно увлекательное зрелище. Когда система Autolayout, наконец, побеждена, то есть все ограничения (constraints) созданы правильно, ее работа на разных устройствах, в портретном и ландшафтном режимах, при локализации на различных языках кажется «магией».
Лекция и слайды на английском языке iTunes название “8. View Controller Lifecycle, Autolayout.”. Код для Демо «Psychologist VCL«, «ShowSizeClass» и «Autolayout» доступен на Stanford.
Есть небольшое изменение в коде демонстрационного примера «Autolayout» на случай, если у вас «не уходит» keyboard в iOS 8.3 Swift 1.2.
Для Swift 2.0 и Xcode 7 код демонстрационных примеров «Psychologist VCL«, «ShowSizeClass» и «Autolayout» находится здесь.
Русский неавторизованный конспект лекции , хронометрированный через каждые 5 минут, представлен в PDF — файлах.
Начало конспекта находится в PDF-файле
Остальная часть лекции виде PDF-файла доступна на платной основе.
Добрый день! В Psychologist VCL когда мы выводим в output сообщения о вызове методов «жизненного цикла» View Controller есть такая переменная для подсчета экземпляров класса var instanceCount = { globalPsychologistInstanceCount++ }()
В Swift 3 мы отказываемся от инкрементора, cоветуют его везде менять на +=1. В нашем случае это не работает- как быть? 🙂
Может быть так:
var instanceCount:Int = {defer {
globalPsychologistInstanceCount += 1
}
return globalPsychologistInstanceCount
} ()
или еще проще
var instanceCount:Int = {
globalPsychologistInstanceCount += 1
return globalPsychologistInstanceCount - 1
} ()
Первый способ лучше, второй — опаснее из-за потери точности.
Супер, значит мы задаём closure в котором каждый раз увеличиваем globalPsychologistInstanceCount на 1 и с помощью defer откладываем это увеличение на самый конец как раз перед тем как выполнение кода покинет текущей блок. Благодарю! 🙂