Задание 4. CS193P Winter 2015. Решение — обязательные пункты 1- 4.

Screen Shot 2015-07-14 at 8.43.44 AMТекст Домашнего задания на английском языке доступен на  iTunes в пункте “Developing iOS 8 app: Programming: Project 4″.  Текст Домашнего задания на русском  языке доступен на 

Задание 4 iOS 8.pdf

 Для выполнения этого Задания необходимо освоение  Лекции 9Лекции 10 и Лекции 11.
В этом посте подробно описывается выполнение обязательных пунктов 1-4.
Код для Swift 1.2 находится на Github. Код для Swift 2.0 находится на Github.

Пункт 1 обязательный

Усовершенствуйте приложение Smashtag, полученное на лекции, в части выделения  (разными цветами каждого)  hashtags, urls и user screen names, упомянутых в тексте твита (они известны как “mentions” — меншены). Заметьте, что эти mentions уже обнаружены для вас в каждом твите и представлены как [IndexedKeyword]s в классе Tweet в поставляемом коде Twitter.

Читать далее

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

Читать далее

Задание 4 cs193p Winter 2015 Smashtag (Выборка данных из Twitter)

Текст Задания 4 на английском языке доступен на  iTunes в пункте “Developing iOS 8 app: Programming: Project 4″.  
Текст Задания  4 на русском  языке размещен в PDF — файле

Задание 4 iOS 8.pdf

Для выполнения Задания 4 необходимо освоить материал Лекции 10 и Лекции 11.
В качестве исходного кода для Задания 4 используется код приложения «Smashtag«, полученный на Лекции 10. Код для Демонстрационного примера «Smashtag» и вспомогательный класс «Twitter» доступны на сайте Stanford.
Пол Хэгерти использовал актуальный на тот момент Swift 1.1. Вариант демонстрационного примера «Smashtag» и вспомогательного класса «Twitter»  для Swift 1.2 выложен на том же сайте   Stanford.

Результаты выполнения заданий можно посылать на форум Swift[ru] для обсуждения.

Замыкания вместо делегирования в iOS 8 Swift

Screen Shot 2015-05-26 at 10.19.34 AM

При проектировании iOS приложений со многими MVC приходится решать вопросы передачи информации от одного MVC к другому MVC как в прямом, так и в обратном направлении. Передача информации в прямом направлении при переходе от одного MVC к последующему , осуществляется обычно установкой Mодели того MVC, куда мы переходим, а вот передача информации «назад» из текущего MVC в предшествующий MVC, осуществляется с помощью делегирования как в Objective-C, так и в Swift.
Кроме того, делегирование используется внутри одного MVC между View и Controller для их “слепого взаимодействия” .
Screen Shot 2015-05-25 at 9.44.52 PM
Читать далее

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

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

UITextField

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

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

Читать далее

Элегантный графический калькулятор без делегирования.

Если у вас есть в коде замыкание (closure), оно захватывает любые переменные из внешнего контекста для использования внутри замыкания. Это очень крутая особенность замыканий. Пользуясь этими возможностями, вы можете сделать иногда исключительно элегантный код. Иногда замыкания могут быть лучшей заменой делегированию.

Давайте сделаем такой элегантный код для нашего графического калькулятора. Возьмем в качестве основы графический калькулятор, в котором выполнены все обязательные пункты Задания 3. В посте «Задание 3. Решение -Обязательные задания» рассказано, как построить график в Графическом калькуляторе с помощью делегирования.

Читать далее

Лекция 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 селектора».

Читать далее

Задание 3. Решение — дополнительные пункты 4, 5 и 6. Окончание.

Screen Shot 2015-05-12 at 8.50.24 PM

Это решение Задания 3 — дополнительные пункты 4, 5 и 6. Обязательные пункты Задания, дополнительные пункты 1, 2 и 3, а также ссылки на текст самого Задания 3 можно посмотреть здесь:

Задание 3. Решение — обязательные пункты.
Задание 3. Решение — дополнительные пункты 1, 2 и 3.

Для окончательного решения код для Swift 1.2 находится на Github. Для Swift 2.0 код можно посмотреть на Github.

Читать далее