Stanford CS 193P iOS 7 Лекция 14 — UIApplication, Network Activity Indicator и Maps ( + iOS 9)

Screen Shot 2015-11-15 at 7.04.03 PM
В начале Лекции 14 кратко рассматривается класс приложения UIApplicationУ нашего приложения есть свойство, называемое delegate, которое устанавливается для вас автоматически, и вы получаете объект Application Delegаte, с помощью которого мы можем делать многие глобальные вещи.

Далее изучается одно специальное свойство UIApplication, а именно визуальный индикатором “сетевой” активности — Network Actity Indicator, который является глобальным и булевским. И именно эти две характеристики делают его использование проблематичным в среде с множеством перекрывающихся потоков, использующих сетевые запросы в одно и то же время.

Затем комментируются особенности демонстрационного примера с прошлой лекции, связанного с выборкой данных в фоновом режиме, и продолжает демонстрационный пример Photomania, обеспечивая работу приложения на iPad. Кроме того,  добавляется Popover segue и особенности его работы в Split View. Демонстрируется, как легко можно заимствовать UI из другого приложения путем прямого копирования и вставки элементов пользовательского интерфейса непосредственно на storyboard.

Читать далее

Лекция 13 CS193P Winter 2015 — Application Lifecycle («жизненный цикл приложения») и Core Motion

Screen Shot 2015-09-02 at 8.52.27 AM

В Лекции 13 на сцену выходит в главной роли файл AppDelegate, до сих пор прятаемый Полом Хэгерти во вспомогательную папку Supporting Files, чтобы не мешал. В результате в Лекция 13 освещаются три темы:

NSNotification

Это действительно важная часть MVC шаблона конструирования. Она нужно для передачи информации от Model к Controller  или от Глобального контекста к Controller. Иногда   в приложении происходят глобальные вещи, и нам нужно транслировать эту информацию специальным  View Controllers, заинтересованным в ней. View Controllers подписываются на  слушание определенных «радиостанций» и, таким образом, узнают о глобальных событиях в приложении.  В лекции рассказывается о том, как в iOS организован механизм передачи уведомлений, описываемых классом NSNotification: как создать «радиостанцию» и послать уведомление, как получить уведомление путем слушания вещания определенной «радиостанции».

Application Lifecycle

Читать далее

Лекция 12 CS193P Winter 2015 — Dynamic Animation

Screen Shot 2015-07-20 at 7.53.07 PM

Лекция 12 посвящена другому подходу к анимации, созданию ряда «физических поведений», определяющих как динамические объекты должны взаимодействовать друг с другом и с границами в этой физической среде.

Эта анимация очень интересная и очень простая в использовании. Чтобы изучить все APIs динамического движка Dynamic Animation, основанного на физических принципах, Пол Хэгерти  создает в своем демонстрационном примере игру Dropit. Но вначале перед вами предстают теоретические основы и принципы работы движка Dynamic Animation.

Аниматор

Сначала создается аниматор, действующий в пределах игровой зоны, представляющей собой UIView. В силу определенных причин используется lazy сценарий его инициализации.

«Поведения»

Читать далее

Stanford CS 193P iOS 7 Лекция 13 — Core Data и Table View ( + iOS 8 и iOS 9)

 Лекция 13  iOS 7 Objective-C начинается с детального обсуждения финального проекта, который должны разработать студенты Стэнфорда. Это обсуждение представляет интерес только для студентов Стэнфорда и по этой причине в моем конспекте отсутствует.

Затем совсем недолго ( буквально несколько слайдов) следует продолжение теоретической части о том, как Core Data соединяется с UITableView, потому что этот “брак заключен на небесах”. Core Data — это куча объектов, большой граф объектов, а Table Views — реально хороший инструмент для обхода графа объектов. Как нам добиться их взаимодействия? В iOS есть замечательный класс  с именем NSFetchedResultsController. Пол Хэгарти очень подробно рассказывает о тонкостях использования этого класса. В результате рождается класс с именем CoreDataTableViewController, который, с одной стороны реализует все методов UITableViewDataSource,  а с другой стороны — устанавливает себя делегатом для “отслеживания” изменений в Core Data.

Читать далее

Лекция 11 CS193P Winter 2015 — Unwind Segues, Alerts, Timers, View Animation

https://www.youtube.com/watch?v=m63jMyEgmgU

Лекция 11 — чисто теоретическая и начинается она с детального обсуждения финального проекта, который должны разработать студенты Стэнфорда. Обсуждение финального проекта длится почти 30 минут и представляет интерес, наверно, только для студентов Стэнфорда.

Unwind Segue

Это единственный segue, который  в процессе “переезда” не создает новый экземпляр MVC. Этот тип segue очень хорошо подходит для того, чтобы возвращаться назад к любой карте из стэка в Navigation Controller.

Другой случай использования unwind segue связан с MVC, который был представлен модально. Для этого случая  unwind segue подходит как нельзя лучше, потому что альтернативой ему является только делегирование. Однако использование unwind segue в этом случае многократно легче делегирования.

В лекции подробно рассматриваются особенности применения этого segue.

Alerts and Action Sheets

Читать далее

Лекция 10 CS193P Winter 2015 — Table View

Хотя вся Лекция 10 посвящена Table View, начинается она с маленькой темы, посвященной UITextField

UITextField

Пол Хэгерти предупреждает от чрезмерного использования UITextField на iPhone и даже на iPad.

В силу малости клавиатуры на iPhone вам захочется построить пользовательский интерфейс приложения без использования текстового поля. На iPad — ситуация лучше, но даже там пользователи скорее предпочтут что-то выбирать и кликать, чем прибегать к клавиатуре для набора текста. Если вы создадите пользовательский интерфейс с текстовым полем и попробуете что-то напечатать, то подумаете :”А это здорово!” Но это не так, потому что на симуляторе может работать клавиатура вашего компьютера, и UI может показаться действительно замечательным. Но когда пользователь начнет пользоваться вашим приложение, то возненавидит ваш UI. Так что будьте внимательны с UITextField. Но иногда вам абсолютно необходимо получить произвольную строку от пользователя и может понадобиться UITextField.

Читать далее

Лекция 9 CS193P Winter 2015 — Scroll View и Многопоточность (Multithreading)

Лекция 9 начинается с дополнительной информации о том, как управлять появлением отдельных элементов пользовательского интерфейса в различных Size Classes и как инспектировать ограничения (constraints) в различных Size Classes.

Scroll Views

Пол Хэгерти демонстрирует работу Scroll View, показывает как добавить subviews к Scroll View, как установить контентную область для прокрутки  и какие действия небходимо выполнить, чтобы  Scroll View заработал. Профессор подробно рассказывает о методах, с помощью которых можно определить, какая часть контентной области видна в данный момент времени, как управлять прокруткой программным образом и т.д.

Особое внимание уделяется масштабированию содержимого контентной области и применению делегата UIScrollViewDelegate, который опирается на протоколы старого Objective-C  стиля. Этот стиль протокола позволяет иметь необязательные (optional) методы. В протоколах нового Swift стиля нет необязательных (optional) методов. В Лекции 9 Пол Хэгерти указывает, какие методы делегата задействованы в масштабирование. Масштабирование также можно выполнять программным образом.

Замыкания

Замыкания содержат куски кода и захваченные из окружающего контекста переменные. Для того, чтобы избежать циклических ссылок, используются  weak или  unowned ссылки.

Пользуясь тем, что замыкания  захватывают переменные из окружающего контекста, вы можете сделать иногда исключительно элегантный код, который может быть лучшей заменой делегированию. Пример такого кода приводится в Лекции 9.

Многопоточность

Для того, чтобы избежать блокировки взаимодействия пользователя с приложением, ресурсоемкие работы должны выполняться в других очередях, отличных от main queue (главной очереди).  Очередь main queue должна оставаться свободной для UI. При получения  данных в других очередях, для корректировки UI (если это необходимо), нужно опять вернуться в main queue.

Современные методы многопоточного программирования немного тяжеловаты для нашего воображения. Дело в том, что некоторые вещи в многопоточном программировании осуществляются в другом порядке, так как они выполняются в разных потоках. Как с этим справиться показано на примере многопоточного приложения Cassini.

Лекция и слайды на английском языке iTunes название “9. Scroll View and Multithreading.”.  Код для Демо «Cassini» Для Swift 1.2 доступен на  Stanford

Для Swift 2.0 и Xcode 7 код демонстрационного примера «Cassini» находится здесь.

Русский неавторизованный конспект лекции , хронометрированный через каждые 5 минут, представлен в PDF — файлах, которые доступы на платной основе.

Дополнение к Лекция 2 — особенности кода Calculator в Swift 1.2 и Swift 2.0 или как не «застрять» на этом месте

Если вы приступаете к изучению  Лекции 2 (1-ая часть, 2-ая часть и 3-я часть) с загруженными Swift 1.2  и Xcode 6.3, а не Swift 1.1  и Xcode 6.2, как у профессора Пола Хэгерти, то ближе к концу лекции (конец 2-ой части) вы получите ошибку, которой у профессора нет. Это может сильно «притормозить» ваш процесс обучения.  Для того, чтобы этого не произошло, я расскажу, чем отличается ситуация, которую демонстрирует профессор, в Swift 1.1 и в Swift 1.2. Профессор Пола Хэгерти хочет показать такую возможность  Swift как перегрузка (overloading) функций с одинаковыми именами на примере функций performOperation для операций с одним и двумя аргументами

Screen Shot 2015-02-03 at 2.29.20 PM
Его «задумка» в Swift 1.1 сработает, и он не получит никакой ошибки, а вы в Swift 1.2 — получите ошибку

 Method 'perform' with Objective-C selector 'perform: ' conflicts with previous declaration with the same Objective-C selector

которая говорит о том, что «Метод perform c Objective-C селектором perform: конфликтует с предыдущим определением того же самого Objective-C селектора».

Читать далее

Лекция 8 CS193P Winter 2015 — «Жизненный цикл» View Controller, Автоматическая разметка (Autolayout)

В Лекции 8 рассматриваются две главные темы. Первая тема — это  “жизненный цикл” View Controller, то есть как View Controller рождается, живет, делает много интересных дел и затем умирает. Профессор подробно рассказывает нам о всех этапах жизни View Controller и о том, какие сообщения посылает ему система на протяжении его «жизненного цикла».  Он начинает с момента создания View Controller, затем следует подготовка View Controller для того случая, когда к этому View Controller кто-то “переезжает”  (segue). Следующий этап — установка ваших outlets, затем ваш View Controller появляется (appear) на экране и может исчезнуть (disappear), и может опять появиться, и опять исчезнуть.  Затем его геометрия может быть изменена , например, при автоматическом вращении (autorotation) прибора или еще по каким-то другим причинам.  В некоторых неочевидных случаях может иметь место ситуация нехватки памяти на вашем устройстве, и система может вовлечь вас в решение этой проблемы.

Он не просто перечисляет такие методы «жизненного цикла» View Controller, как viewDidLoadviewWillAppear и viewDidAppearviewWillDisappear и viewDidDisappear, viewWillLayoutSubviews и viewDidLayoutSubviews,
viewWillTransitionToSize и другие, но также очень подробно рассказывает о том, в каких ситуациях их нужно применять, а в каких воздержаться от их использования.

Читать далее

Дополнение к Лекции 7: Изменение адаптивности Popover в iOS 8.3

Эта тема важна для Лекции 7, в которой рассматривается Popover для iPhone и iPad, и для демонстрационного примера «Psychologist Popover«, который доступен на сайте  Stanford. Этот демонстрационный пример в части Popover  на iPhone будет работать в iOS 8.3 не так, как планировалось. Вариант исправленного демонстрационного примера «Psychologist Popover« для iOS 8.3 доступен на  Github. Ниже дается пояснение проблемы.

Адаптивность до  iOS 8.3

Само по себе Popover — не UIViewController. Он появляется на экране, используя так называемый механизм Presentation Controller. Popover на iPad “всплывает” так, как вы видели на рисунке выше для iOS 8.2. В виде маленького окошка со стрелкой. На iPhone Popover адаптируется и превращается вместо маленького окошка в модальное окно на полный экран. Оно не “всплывает” как что-то маленькое на iPhone. Что касается iPhone 6 Plus, то в портретном режиме он ведет себя как iPhone ( модальное окно на весь экран), а в ландшафтном режиме как iPad ( маленькое «всплывающее» окно). Такая Адаптация делается автоматически. iOS 8 автоматически делает эту адаптацию также, как автоматически адаптируется Split View и Navigation Controller для iPhone.
Перед iOS 8.3, Адаптивность Popover работала, когда горизонтальный size class изменяется от Regular к Compact.

Читать далее