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.

Читать далее

Лекция 4 CS193P Winter 2015 — Больше Swift и Foundation Frameworks. (часть 2. AnyObject, as?, is, String.Index)

Title iOS 8

STANFORD UNIVERSITY: Разработка iOS 8 приложений с Swift CS193P

 Лекция 4: Больше Swift и Foundation Frameworks

Профессор Пол Хэгарти (Paul Hegarty)

Лекцию на английском языке и слайды можно найти на  iTunes название  “4. More Swift and Foundation Frameworks”.

Русскоязычный неавторизованный конспект лекций принадлежит сайту bestkora.com/IosDeveloper

Начало: 1 — ая часть лекции (0 — 37 минут) находится здесь.
Этот документ:  продолжение: 2 — ая часть лекции (37 минута — конец ) 

Примечание переводчика. В документе почти каждый слайд точно переводится на русский язык. Текст перевода располагается между двумя горизонтальными линиями сразу вслед за слайдом. Далее следует речь профессора, который повторяет то, что изображено на слайдах, а иногда и сам повторяет одну и ту же мысль в разных вариантах. Этот документ содержит живую речь и не подвергался глубокому редактированию. 

————————————- 37 -ая минута лекции ————————-

Давайте поговорим о наследовании init. Потому что это также сложно. Ниже представлены правила при наследовании  init.

Screen Shot 2015-02-15 at 6.16.20 PM


Инициализация

  • Наследование init.

Если  вы не реализуете никакие назначенные inits, то вы унаследуете все назначенные inits вашего superclass
Если  вы переопределите (override)  все назначенные inits вашего superclass, то вы унаследуете все convenience inits вашего superclass
Если  вы не реализуете ни одного  inits в, то вы унаследуете все  inits вашего superclass
Любой  inits, унаследованный по этим правилам, должен удовлетворять всем правилам на предыдущем слайде

  • Required init.

Класс может пометить один или более  init методов как required
Любой subclass должен реализовать эти упомянутые методы ( даже если они были унаследованы по приведенным выше правилам)


Например, ваш superclass имеет три назначенных (designated) инициализатора с различными аргументами. Если вы переопределите (override) все, то тогда вы наследуете все convenience inits вашего superclass.
Также если вы не реализуете ничего, вы наследуете все назначенные (designated) инициализаторы и все convenience inits вашего superclass в этом случае.
Это правила наследования. Людей это ставит в тупик : » Я реализовал один инициализатор, а почему другие не работают?»
Как только вы реализовали один назначенный (designated) инициализатор, вы не наследуете остальные. Либо все, либо ничего, если дело касается назначенных инициализаторов (designateds).
В отношении convenience inits тоже либо все, либо ничего.
Потому что вы должны либо реализовать все, либо не реализовать ничего, чтобы получить в наследство convenience inits.
Любой init, унаследованный по этим правилам должен принимать в внимание правила на предыдущем слайде.
Возможно иметь то, что называется required init. Если вы поставили ключевое слово required перед  init, то это означает, что subclasses должны реализовать этот  init. 
Вы можете наследовать required init по правилам, указанным выше.
Если вы не реализовали ни одного назначенного инициализатор, то вы наследуете все, в том числе и  required init. Это нормально. Но если вы реализовали какой-то из назначенных инициализаторов, то вы должны выполнить и required inits.

Читать далее

Лекция 3 CS193P Winter 2015 — Применяем MVC. (часть 2)

STANFORD UNIVERSITY: Разработка iOS 8 приложений с Swift CS193P

 Лекция 3: Применяем MVC

Профессор Пол Хэгарти (Paul Hegarty)

Лекцию на английском языке и слайды можно найти на  iTunes название  “3. Applying MVC”.

Это — продолжение: 2 — ая часть лекции (36 минута — конец ), код для Swift 1.2 находится на  Github. Код для Swift 2.0 находится на Github.

Начало: 1 — ая часть лекции (0 — 36 минут) можно посмотреть здесь.

—————————— 36 минута лекции ———————————

Screen Shot 2015-02-07 at 7.58.59 AM

Давайте займемся написанием кода для нашей вспомогательной функции

func evaluate(ops: [Op])  -> (result: Double?, remainingOps: [Op])

И первое, что я сделаю в этой рекурсивной функции, — напишу строку кода для случая невозможности выполнения рекурсии с возвращением nil.

return (nil, ops)

Это строка говорит о том, что я (калькулятор) делаю все, что могу, чтобы оценить ops, который вы мне передали, но я не могу это сделать и возвращаю в качестве результата  nil.
Это будет мой возврат кортежа по умолчанию: в случае отсутствия операндов в стеке или недостаточного их количества и т.д.

Читать далее

Лекция 3 CS193P Winter 2015 — Применяем MVC. (часть 1)

Title iOS 8

STANFORD UNIVERSITY: Разработка iOS 8 приложений с Swift CS193P

 Лекция 3: Применяем MVC в iOS

Профессор Пол Хэгарти (Paul Hegarty)

Лекцию на английском языке и слайды можно найти на  iTunes название  “3. Applying MVC”.

Русскоязычный неавторизованный конспект лекции приводится ниже.

Вы можете читать к PDF-файл конспекта и использовать его offline

Лекция 3 CS193P Winter 2015 iOS 8.pdf

Начало: 1 — ая часть лекции (0 — 36 минут).

Продолжение: 2 — ая часть лекции (36 минута — конец ) — находится здесь.

Код для Лекции 3 находится на Github.

Это лекция 3. Она вся будет посвящена демонстрационному приложению Calculator.

Сегодня сделаем наш калькулятор Сalculator более мощным. Но что более важно, мы заставим его следовать парадигме конструирования  MVC. То есть я покажу, как мы разделим наше приложение на 3 лагеря. Ну, а кроме этого я буду продолжать знакомить вас с возможностями языка Swift, как обычно. Собственно это является задачей первых 3-х лекций с демонстрационным приложением Calculator.
Моя задача показать вам все это в действии, потому что вы можете сколько угодно читать о Swift, iOS, но до тех пор, пока вы не увидите это в действии, не превратите это в приложение, реально вы не будете знать Swift и iOS. Моя задача сделать для вас это реальностью.

Читать далее