Задание 4. CS193P Winter 2017. Smashtag Mentions (клиент Twitter). Решение — дополнительные пункты 1-5.

Содержание

Текст Домашнего Задания 4 на английском языке доступен на  iTunes в пункте “Programming: Project 4: Smashtag Mentions″На русском языке вы можете скачать здесь:

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

iOS 10 Задания


В Задании 4 вы должны усовершенствовать приложение Smashtag, которое мы создали на Лекции 9, чтобы обеспечить быстрый доступ к хэштэгам hashtags, URLs urls, изображениям images и пользователям users, упомянутым в твите. Основными идеями в этом Задании являются многопоточность, работа с таблицей Table View, глубокое знание Navigation Controller, множественные MVC типа Tab Bar Controller и работа с изображениями с помощью Scroll View.

Основой для решения Задания 4 является демонстрационный пример «Smashtag L9«, код которого доступен как на  iTunes название “Lecture 9 Demo Code: Smashtag«, так и на Github.

В данном посте представлено решение Дополнительных пунктов 1 — 5 Задания 4. Код можно найти на Github.

Начало решения Задания 4 находится в постах:

Задание 4 CS193P Winter 2017. Smashtag Mentions (клиент Twitter). Решение — обязательные пункты 1- 7.
Задание 4. CS193P Winter 2017. Smashtag Mentions (клиент Twitter). Решение — обязательные пункты 8 — 10.

Код для Обязательных пунктов 1- 7 находится на Github.
Код для Обязательных пунктов 1- 10 находится на Github.
Код для Дополнительных пунктов 1- 5 находится на Github.

Пункт 1 дополнительный

В секции Users вашего нового UITableViewController представьте список не только пользователей, users, упомянутых в твите, но также и пользователей users, пославших твит в первое место.

Если вы создали хорошую внутреннюю структуру данных для данных секции, то этот дополнительный пункт будет заключаться лишь в усовершенствовании инициализации меншенов в классе MentionsTableViewController в методе :

Вначале мы помещаем в массив userItems тех пользователей, которые послали твит в первое место, снабдив их лидирующим знаком «@», затем добавляем тех, кто упомянут в этом твите.

Пункт 2 дополнительный

Когда вы кликаете на user в секции Users, ищите не только те твиты, в которых “упоминается” этот user, но и твиты, где это пользователь user посылает твиты.

Используя синтаксис запросов в Twitter, мы изменим строку поиска, которая формируется при выборе элементов секции Users в в классе MentionsTableViewController в методе prepare (for segue:, sender:)


.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
В результате получаем желаемый результат:

Пункт 3 дополнительный

Пользовательский интерфейс (UI) вашего приложения может проникать очень глубоко в стэк UINavigationController (когда вы “преследуете” меншены все дальше и дальше). Добавьте некоторый элемент UI, который позволил бы пользователю в любое время “сбросить” весь стэк до корневого rootViewController вашего UINavigationController.

Мы добавим во все экранные фрагменты, кроме корневых, кнопку Stop в правую часть навигационной панели, чтобы она возвращала нас к корневому экранному фрагменту из любой ситуации, как бы мы далеко не зашли в «преследовании меншенов»

Для того, чтобы добавить кнопку Stop, нужно вытянуть из Палитры Объектов кнопку Bar Button Item (это не обычная кнопка UIButton,  а именно панельная кнопка UIBarButtonItem) и добавить ее на навигационную панель:

Панельная кнопка Stop — системная кнопка, и нам больше ничего не нужно делать с ее внешним видом.
Теперь создадим Action  для этой кнопки с помощью CTRL-перетягивания от кнопки в код и называем его toRootViewController:

Это очень простой  Action — он возвращает нас в корневой View Controller:

Надо заметить, что на схеме, представленной в самом начале этого дополнительного пункта, выделен экранный фрагмент TweetTableViewController, который из-за петель, образованных segues, может выступать как в роли корневого View Controller, так и участника «преследования меншенов«. Пользовательский интерфейс (UI), относящийся к “сбросу стэка” (“pop back”), очевидно, не должен появляться, когда вы находитесь на  корневом View Controller.
Поэтому для  TweetTableViewController мы создаем кнопку Stop в коде в зависимости от обстоятельств:

Все кнопки Stop в других Controller «подвязываем» к аналогичным Action toRootViewController.
Мы добавляем кнопку Stop в методе «жизненного цикла» viewWillAppear, когда navigationController гарантированно определен и не равен nil, так что navigationController?.viewControllers.count будет считаться правильно. Заметьте, что кнопка Stop добавляется к уже существующим на навигационной панели правым кнопкам navigationItem.rightButtonItems, при условии, что ее там нет.
Запускаем — все работает. Вы видите. что на стартовом экране кнопки Stop НЕТ, а на экранах, которые появились в результате «погони за меншенами» кнопка Stop появилась.

Если появятся новые Controller мы будем поступать точно также.

Пункт 4 дополнительный

Вместо открытия urls в Safari, покажите их в вашем приложении путем “переезда” ( segueing) на Сontroller с UIWebView. Вам понадобиться обеспечить по крайней мере простейшее “управление браузером” с помощью элементов UI, которые приходят вместе с UIWebView (например, кнопка “назад” (“back button”)). Помните, что UINavigationController может показывать кнопки внизу с помощью метода toolbarItems во вставленном (embedded) MVC.

С помощью UIWebView мы сможем, во-первых, менять внешний облик возвратной кнопки, а, во-вторых» вмешиваться с помощью делегата в сам процесс загрузки web страницы, например, добавляя индикатор активности в виде маленького «вращающегося колесика».
Итак, приступим. Добавляем из палитры объектов новый View Controller на storyboard. Добавляем также из палитры объектов Web View и Activity Indicator View на новый View Controller и устанавливаем необходимые ограничения с помощью механизма Autolayout. А также кнопку Stop на навигационную панель для возврата на корневой экранный фрагмент:

Добавляем segue от Mentions  к Web  View (заметьте, что НЕ ОТ cell, а ОТ самого View Controller) с идентификатором «Show URL«.

Создаем новый класс WebViewController для нового Web View и не забываем его установить в Инспекторе Идентичности:

Добавляем outlets для Web View и Activity Indicator:

Как только outlet webView установлен, загружаем web страницу с заданным URL, который является  Public API для этого класса :

Кроме того, мы добавили на навигационную панель слева пользовательскую кнопку back для возврата на предыдущую web страницу, предварительно загрузив для нее иконку:

Screen Shot 2016-07-20 at 5.57.24 AM

Кнопка будет возвращать нас на предыдущую web страницу:

Делаем так, чтобы наш новый класс подтверждал протокол UIWebViewDelegate и делаем его делегатом Web View, чтобы использовать его методы для старта и завершения загрузки web страницы:

.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

Мы используем методы делегата для запуска и остановки как индикатора активности, расположенного в центре экрана, так и для сетевого индикатора на статусной панели.
В классе MentionsTableViewController, обслуживающем таблицу меншенов, мы вместо вызова Safari выполняем метод performSegueWithIdentifier:

.  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .

В структуру Storyboard добавляем константу для идентификатора segue для Web View Controller:

Запускаем приложение и получаем замечательный результат:

Пункт 5 дополнительный

Сделайте таблицу с “недавними поисковыми терминами” редактируемой (то есть позвольте пользователю использовать жест Swipe влево для удаления терминов, которые ему не нравятся).

В классе RecentsTableViewController реализуем метод делегата Table View, поддерживающий редактирование таблицы:

Вначале удаляем строку из Модели, а затем непосредственно из таблицы. Модель, структура RecentSearches  поддерживает удаление элемента с заданным индексом:

В результате получаем возможность удалять строки из таблицы с “недавними поисковыми терминами”:

Код можно найти на Github.
Продолжение находится в посте Задание 4. CS193P Winter 2017. Smashtag Mentions (клиент Twitter). Решение — дополнительный пункт 6. UICollectionView и перемещение ячеек.