КулЛиб - Классная библиотека! Скачать книги бесплатно 

Программируем для iPhone и iPad [Трейси Пайлон] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Т. Пайлон, Д. Пайлон
Программируем для iPhone и iPad
3-е издание
Серия «Head First O’Reilly»
Перевел с английского Е. Матвеев
Заведующий редакцией
Руководитель проекта
Ведущий редактор
Корректор
Верстка

П. Щеголев
А. Юрченко
Ю. Сергиенко
С. Беляева
Н. Лукьянова

ББК 32.973.23-018
УДК 004.42

Пайлон Т., Пайлон Д.
П12

Программируем для iPhone и iPad. 3-е изд. — СПб.: Питер, 2014. — 336 с.: ил. — (Серия «Head First O’Reilly»).
ISBN 978-5-496-01083-2

С появлением iPhone мир изменился. Потом с появлением iPhone 4 он изменился снова. А теперь к iPhone добавился еще и революционный
планшет iPad. Современные устройства на базе iOS используются в бизнесе и учебе, для работы и развлечений, и на App Store уже сейчас
успешно работают десятки тысяч программистов и известных софтверных компаний.
Представим, что у вас появилась гениальная идея приложения для iPhone и iPad. С чего начать? Эта книга поможет вам разработать свое
первое приложение в самые кратчайшие сроки. Вы не только узнаете, как спроектировать приложение для устройств Apple и сделать его уникальным, но и в совершенстве овладеете принципами программирования на Objective-C и инструментами iPhone SDK, в том числе Interface Builder
и Xcode. Apple предоставляет программное обеспечение, эта книга дает знания — от вас потребуется лишь энтузиазм и желание научиться
разрабатывать оригинальные и коммерчески успешные приложения для iPhone и iPad. Новое издание книги охватывает версии iOS7 и Xcode5.
Особенностью данного издания является уникальный способ подачи материала, выделяющий серию «Head First» издательства O’Reilly
в ряду множества скучных книг, посвященных программированию.

6+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.)
ISBN 978-1449316570 англ.

978-5-496-01083-2

Authorized Russian translation of the English edition of Head First iPhone and iPad
Development, 3rd Edition (ISBN 9781449316570) © 2013 Dan Pilone and Tracey
Pilone. This translation is published and sold by permission of O’Reilly Media, Inc.,
which owns or controls all rights to publish and sell the same.
© Перевод на русский язык ООО Издательство «Питер», 2014
© Издание на русском языке, оформление ООО Издательство
«Питер», 2014

Права на издание получены по соглашению с O’Reilly. Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой
бы то ни было форме без письменного разрешения владельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее, имея в виду
возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений
и не несет ответственности за возможные ошибки, связанные с использованием книги.

ООО «Питер Пресс», 192102, Санкт-Петербург, ул. Андреевская (д. Волкова), 3, литер А, пом. 7Н.
Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2; 95 3005 — литература учебная.
Подписано в печать 27.05.14. Формат 84×108/16. Усл. п. л. 35,280. Тираж 1000. Заказ 0000.
Отпечатано в полном соответствии с качеством предоставленных издательством материалов
в Чеховский Печатный Двор. 142300, Чехов, Московская область, г. Чехов, ул. Полиграфистов, 1.

Посвящается всей моей семье: Чедвикам, Пайлонам и коллективу Element 84, которые поддерживали меня как дома,
так и на работе. Также посвящается моему мужу, который
всегда со мной и без которого моя жизнь не была бы такой
интересной.
— Трейси

Посвящается моей жене, бизнес-партнеру и лучшему другу.
Она вдохновила меня написать первое издание, а в этом
выполнила большую часть работы. :)
— Дэн

авторы

Aâòîðû
Трейси

Дэн

Трейси Пайлон — соучредитель (вместе
с Дэном Пайлоном) и руководитель проектов в
Element 84 — начинающей фирме, занимающейся
разработкой масштабируемых мобильных приложений и веб-приложений. Кроме непосредственного участия в разработке, она также работает с
группами гибкой разработки Element 84 в области
управления проектами и организации взаимодействия с клиентами.
До того как создать Element 84, Трейси несколько
лет проработала в Вашингтоне руководителем
строительных работ в области коммерческого
строительства. Это ее четвертая книга из серии
Head First; до этого вышли два издания этой книги
и Head First Algebra.
Трейси получила диплом в области гражданского
строительства в Политехническом институте
Вирджинии, а также степень магистра педагогики
в Университете Вирджинии; имеет разрешение
на работу в качестве инженера-консультанта в
штате Вирджиния. Вы можете читать ее сообщения в Twitter: @traceypilone.

6

Дэн Пайлон — основатель и партнер-распорядитель Element 84 — компании, занимающейся консультациями и разработкой мобильных
приложений. Он проектировал и реализовывал
системы для NASA, Hughes, ARINC, UPS и Naval
Research Laboratory. В настоящее время руководит техническими проектами NASA, а также
всеми проектами Element 84. Он часто выступает
с докладами в сообществе, в последнее время
ESIP, AGU и DC Ruby Users Group.
Дэн преподавал управление проектами, проектирование программного обеспечения и программотехнику в Католическом университете
Вашингтона (федеральный округ Колумбия
был инструктором на семинарах D.C. iPhone
Bootcamp и написал несколько книг по разработке программного обеспечения, включая Head
First Software Development, UML 2.0 in a Nutshell и
UML 2.0 Pocket Reference. Вы можете читать его
сообщения в Twitter: @danpilone.

Íàøè ñîàâòîðû
Пол

Бретт

Пол Пайлон — разработчик на платформе
iOS и Rails из компании Element 84. Является
автором приложений iHomework, а также приложений для iPhone, iPad и Mac для управления
домашними заданиями. Пол писал программы
для Naval Research Labs, Lockheed Martin, NASA
и Cengage Learning. Вы можете читать его сообщения в Twitter: @paulpilone.

Бретт Маклафлин — разработчик из компании Element 84; также занимался теорией познания. Рассматривает HTML5, CSS, JavaScript,
Java и Rails не как скучные технологии и протоколы, а как возможность рассказывать интересные истории для пользователей. Также
интересуется коммуникационными технологиями следующего поколения, от электронных
книг до мобильных устройств. А в свободное
время (да откуда оно возьмется?) Бретт обычно
развлекается с видео, программирует и играет
на гитаре... очень дорогой акустической гитаре.

7

оглавление

Содержание (сводка)
Введение

19

1

Первые шаги. iOS и эпоха мобильности

31

2

Основные паттерны iOS. Строим приложение «с нуля»

59

2.5

Интермедия. Синтаксис

105

3

Таблицы, представления и данные. Таблица и представление

119

4

Приложения с несколькими представлениями.
Такие важные подробности

163

5

Процесс рецензирования, дизайн и устройства.
Как жить в «яблочном» мире

199

Core Data и ячейки табличного представления.
Как поймать любимую передачу

223

7

Реализация поиска с Core Data. Поиск информации

261

8

Core Data, map kit и Core location. В поисках телефонной будки

267

6

Содержание (настоящее)
Введение
Ваш мозг думает о разработке приложений для iOS.
Вы сидите за книгой и пытаетесь что-нибудь выучить, но ваш мозг
считает, что вся эта писанина не нужна. Ваш мозг говорит: «Выгляни
в окно! На свете есть более важные вещи, например сноуборд». Как
заставить мозг думать, что ваша жизнь действительно зависит от
умения разрабатывать приложения для iPhone и iPad?

Для кого написана эта книга?
Мы знаем, о чем вы думаете
Метапознание: наука о мышлении
Что можете сделать вы, чтобы заставить свой мозг
повиноваться
Примите к сведению
Технические рецензенты
Благодарности
8

20
21
23
25
26
28
29

оглавление

1

первые шаги
iOS и эпоха мобильности
С появлением iPhone мир изменился. Когда Стив Джобс произнес
эту фразу при выпуске iPhone, мало кто ему поверил. Прошло шесть лет,
и устройства iPhone и iPad используются в бизнесе и медицине, а на платформе App Store работает множество программистов — от талантливых
одиночек до известных фирм. Apple предоставляет программное обеспечение, мы поможем вам знаниями — от вас потребуется лишь энтузиазм.

Итак, вы хотите написать приложение для iOS...

32

Добро пожаловать во Вселенную Apple!

33

Приложения iOS пишутся на языке Objective-C

34

Все начинается с SDK

35

Это Сью, ваш новый начальник

36

Xcode и Git... неразлучные друзья

37

Xcode находится в центре любого проекта iOS

39

Эмулятор iOS

41

Программа хранится в файлах с исходным кодом

45

Редактор кода, центр управления... да еще и отладчик

50

Один iPhone, два iPhone, красный iPhone, синий iPhone...

52

Ваш инструментарий разработки для iPhone

58

9

оглавление

2

основные паттерны iOS
Строим приложение «с нуля»
Итак, первое знакомство состоялось; теперь пришло время
начать все заново. Вероятно, вы уже примерно представляете, с какими
инструментами вам предстоит работать и как устроена среда Xcode. Пора
изучить проблему более основательно и построить собственный проект.
Как создать проект iOS, как связаны друг с другом компоненты приложений,
на какие схемы взаимодействий следует ориентироваться? Вы это скоро
узнаете — а пока переверните страницу...

Приложения iOS работают в полноэкранном режиме

60

Паттерн Модель-Представление-Контроллер

61

Начинаем с Xcode и Git

65

Переходим к построению интерфейса!

67

Переходим к построению интерфейса... дубль два

69

Xcode позволяет легко вносить косметические изменения

74

Элементы управления iOS изнутри

75

Действия создаются в редакторе графического интерфейса
среды Xcode

77

Связывание элементов управления с действиями

79

И как добраться до текста?

88

Методы чтения и записи свойств создаются автоматически

89

Создайте свойство для текстового поля

91

Элементы управления связываются со ссылками IBOutlet

93

Простая работа с Twitter

96

Ваш инструментарий разработки для iOS

10

104

оглавление

2.5

интермедия
Синтаксис
Пора заняться мелочами. Мы написали пару приложений и более
или менее разобрались с общей картиной. Пришло время досконально,
построчно разбираться в мелочах. Почему в коде повсюду разбросаны
символы @? Чем метод отличается от сообщения? Как именно работают
свойства? Нас ждет краткая экскурсия по синтаксису Objective-C; потом
можно будет вернуться к построению приложений.

Классы: интерфейс и реализация

106

Заголовочные файлы описывают интерфейс класса

107

Свойства используются для эффективности

110

Передача сообщений: как это происходит в Objective-C

113

Раз уж мы занялись сообщениями...

117

Ваш инструментарий синтаксиса

118

11

оглавление

3

таблицы, представления и данные
Таблица и представление
В большинстве приложений iOS используется несколько
представлений. Мы написали симпатичное приложение с одним представлением. И все же каждый, кто когда-либо пользовался смартфоном,
знает, что типичное представление одним представлением не ограничивается. Самые впечатляющие приложения iOS используют при работе со
сложной информацией несколько представлений. Мы начнем с навигационных контроллеров и табличных представлений наподобие тех, которые
используются в приложениях Mail и Контакты. Вот только у нас они будут
использоваться несколько иначе...

12

Поздравляем!

120

Приложение: каталог SpinCity

121

Как работают приложения iOS

122

Иерархические данные — за пределами табличного представления

124

А теперь нужно связать эти два представления...

127

Три представления в одном шаблоне

130

Паттерн MVC используется для разделения обязанностей...

135

Добавление нового класса

136

Свойства предоставляют доступ к атрибутам класса

138

Объекты доступа к данным скрывают
низкоуровневые операции с данными

141

Поздравляем — вы только что создали свой первый объект DAO!

145

Таблица состоит из ячеек

151

Ваш инструментарий представлений

162

оглавление

4

приложения с несколькими представлениями
Такие важные подробности
В большинстве приложений iOS используется более одного
представления. Работа над приложением началась резво: мы воспользовались встроенными шаблонами и внесли довольно впечатляющие
изменения в табличное представление. Пришло время заняться выводом
подробной информации, подготовкой нового представления и управлением навигацией между ними. Многие популярные приложения в App Store
предоставляют удобные и простые средства для работы с большими объемами данных. Приложение Spin City делает то же самое — оно помогает
пользователю найти нужную пластинку, не перерывая многочисленные
конверты на полках!

Детализированные представления

164

Табличные представления не всегда похожи
на... таблицы

166

Замена UIViewController на UITableView Controller

168

Макет нового детализированного представления

170

Включение представления в раскадровке

171

Пути соединяют контроллеры представлений

175

Свяжите сцены в раскадровке

176

Пути позволяют подготовиться к отображению
новой сцены

185

Обновите метод обратного вызова prepareforSegue

186

Для этого есть приложение список

189

Создайте новый список свойств

190

Мы должны загрузить каждый альбом из списка

192

Преобразование данных в список plist
одной простой операцией

193

Ваш инструментарий представлений

197

13

оглавление

5

процесс рецензирования, дизайн и устройства
Как жить в «яблочном» мире
Разработка iOS не ограничивается одним программированием.
Наверняка вы уже слышали всевозможные ужасы. Процесс рецензирования
Apple известен своей строгостью и обилием правил, которые должны соблюдать программисты. Да, не ждите, что все пойдет как по маслу, но если вы
знаете, что делаете, — все отнюдь не так плохо. А кроме того, когда ваше
приложение будет одобрено, перед вами откроется неимоверно популярный
магазин App Store... с множеством покупателей, готовых расстаться со своими
долларами. Разве не заманчиво?

14

Это мир Apple... просто вы в нем живете

201

Проверка устройства — обязательная часть

207

Пример проверки устройства: камера

208

iOS берет на себя технические подробности

208

Хмм... устройство поддерживается, функция недоступна

209

Правила HIG помогают, а не мешают

211

Вы уже понемногу привыкаете к правилам HIG...

212

Дизайн = внешний вид + поведение

214

Пять главных отличий iOS 7

215

Информация к размышлению: iPad — не iPhone

216

Ваш инструментарий Apple

223

оглавление

6

core data и ячейки табличного представления
Как поймать любимую передачу
Устраивайтесь поудобнее и послушайте историю — историю о судьбоносном путешествии. Сегодня часто возникает одна
проблема: как работать с большими объемами данных и организовать их
представление в формате, подходящем для мобильных устройств? Это можно делать многими способами, включая обработку данных и представление
в формате, удобном для навигации и интерпретации. Для примера возьмем
программу телепередач: в эфире идет великое множество программ. Что
делать поклоннику «Острова Гиллигана»?

Это ваше приложение

226

Это ваше приложение с данными

227

Знакомство с Core Data

228

...Кстати, о данных

229

HFN

229

Приложение Gilligizer

230

Core Data начинается с данных

232

Core Data работает с сущностями

235

Для описания сущностей Core Data использует модель
управляемых объектов

236

Построение сущности Show

237

У нас есть объект... теперь его необходимо вывести

252

Вывод сущности в приложении Gilligizer

253

Ваш инструментарий Core Data

260

15

оглавление

7

реализация поиска с core data
Поиск информации
Просто просматривать данные уже недостаточно. Наступила
эпоха больших данных, и с обычным просмотром далеко не уйдешь. Вероятно, объем данных на вашем телефоне еще не измеряется в петабайтах,
и все же он достаточно велик, чтобы функции сортировки и фильтрации упростили работу с ними. Core Data содержит встроенные средства покорения
больших объемов данных, и в этой главе вы научитесь пользоваться ими!

16

Приложение работает, но его возможности
ограничены...

262

Используйте NSFetchRequest для описания поиска

267

Давайте попробуем...

267

В iOS 7 поддержка поиска встроена в Core Data и UIKit

270

Использование предикаторв для фильтрации данных

271

Предикат NSFetchRequest определяет
возвращаемые данные

272

Это был вопрос с подвохом...

274

Ваш инструментарий поиска

281

оглавление

8

core data, map kit и core location
В поисках телефонной будки
Пришло время заняться расширенными возможностями.
Устройства на базе iOS содержат массу полезных встроенных возможностей.
И iPhone, и iPad — это одновременно и компьютер, и библиотека, и фотоаппарат, и видеокамера, и GPS-навигатор. Область технологий геопозиционирования еще только развивается, но уже сейчас она предоставляет
много полезных возможностей. К счастью, iOS позволяет относительно
легко использовать эти функции оборудования.

Все старое становится новым клевым

284

Приложение, iPad и телефонные будки

285

Приложения iOS предназначены только
для чтения (в какой-то степени...)

295

Структура приложения iOS определяет, где можно читать
и записывать данные

296

Знакомьтесь... UIImagePicker

297

Использование карты действий

304

Где эта улица, где этот дом?

311

Core Location может определить текущее местоположение
несколькими способами

312

Map Kit поддерживается всеми устройствами iOS

323

Аннотации: придется поработать

330

Полная реализация протокола аннотаций

331

Ваш инструментарий

334

17

как пользоваться этой книгой

Введение
Не могу поверить, что они
включили такое в книгу
по программированию
для iOS!

Вам нравится?
Книга стоит денег,
которые вы
заплатили за нее,
и станет лучшим
подарком.

ый
ответим на насущн
В этом разделе мы
Е
КО
ТА
и
ил
у они включ
вопрос: «Так почем

iOS
я
дл
ю
ни
мирова
в книгу по програм

19

как пользоваться этой книгой

Äëÿ êîãî íàïèñàíà ýòà êíèãà?
Если вы ответите «да» на все следующие вопросы...

Полезно им
еть некот
орое
представле
ние об объ ек
тноориентиров
анном прог
раммировании. Оп
ыт програм
мирования для
Mac пригод
ится,
но не являет
ся обязател
ьным.

1

У вас уже есть опыт программирования?

2

Вы хотите изучить, запомнить, понять и научиться
разрабатывать приложения для iOS, чтобы писать собственные
приложения и распространять их через App Store?

3

Вы предпочитаете оживленную беседу сухим,
скучным академическим лекциям?

...то эта книга для вас.

Êîìó ýòà êíèãà íå ïîäîéäåò?
Если вы ответите «да» на любой из следующих вопросов:
1

Вы абсолютно не разбираетесь
в программировании?

2

Вы уже занимаетесь разработкой приложений для
iOS и ищете справочник по Objective-C?

3

Вы боитесь попробовать что-нибудь новое?
Скорее пойдете к зубному врачу, чем наденете
полосатое с клетчатым? Считаете, что техническая
книга с телефонной будкой серьезной быть не может?

...эта книга не для вас.

[Заметка от отдел
а
продаж: вообще-то
эта книга для любог
о,
у кого есть деньги.]

20

введение

Найдите кн
игу Head Fi
rst
Programmin
g, в ней приведено отли
чное введен
ие
в объ ектно
-ориентированную р
азработку.
А потом во
звращайтес
ь
к нам.

введение

Ìû çíàåì, î ÷åì âû äóìàåòå.
«Разве серьезные книги по программированию такие?»
«И почему здесь столько рисунков?»
«Можно ли так чему-нибудь научиться?»

Ваш м
о
что Э зг считает
ТО ва
,
жно.

Ìû çíàåì, î ÷åì äóìàåò âàø ìîçã
Мозг жаждет новых впечатлений. Он постоянно ищет, анализирует, ожидает чего-то необычного. Он так устроен, и это
помогает нам выжить.
Как наш мозг поступает со всеми обычными, повседневными
вещами? Он всеми силами пытается оградиться от них, чтобы
они не мешали его настоящей работе — сохранению того, что действительно важно. Мозг не считает нужным сохранять скучную
информацию. Она не проходит фильтр, отсекающий «очевидно
несущественное».
Но как же мозг узнает, что важно? Представьте, что вы выехали на прогулку и вдруг прямо перед вами появляется тигр. Что
происходит в вашей голове и теле? Активизируются нейроны.
Вспыхивают эмоции. Происходят химические реакции. И тогда
ваш мозг понимает...
мозг
Ваш ет, что
а
Конечно, это важно! Не забывать!
полаг ожно
м
.
О
Т
Э
нать
А теперь представьте, что вы находитесь дома или в библиотеке, не запоми

Замечательно.
Еще 315 сухих,
скучных страниц.

в теплом, уютном месте, где тигры не водятся. Вы учитесь — готовитесь к экзамену. Или пытаетесь освоить сложную техническую
тему, на которую вам выделили неделю... максимум десять дней.
И тут возникает проблема: ваш мозг пытается оказать вам
услугу. Он старается сделать так, чтобы на эту очевидно несущественную информацию не тратились драгоценные ресурсы. Их лучше потратить на что-нибудь важное. На тигров,
например. Или на то, что к огню лучше не прикасаться. Или
что на лыжах не стоит кататься в футболке и шортах.
Нет простого способа сказать своему мозгу: «Послушай, мозг,
я тебе, конечно, благодарен, но какой бы скучной ни была
эта книга и пусть мой датчик эмоций сейчас на нуле, я хочу
запомнить то, что здесь написано».

дальше 

21

как пользоваться этой книгой

т учиться.
Эта книга для тех, кто хоче

нять, а потом не
жно это «что-то» по
ну
а
ал
ач
Сн
?
ем
на
аточно. Согласно
Как мы что-то уз
ше фактов недост
ль
бо
по
ву
ло
го
в
ь
, нейробиологии и
забыть. Затолкат
сти когнитивистики
ла
е,
об
в
м
ия
ан
ов
уется что-то больше
новейшим исслед
ия материала треб
ен
во
ус
я
дл
,
зг
ия
мо
ен
ваш
психологии обуч
аем, как заставить
на странице. Мы зн
т
кс
те
й
то
ос
пр
м
че
Погодите... Вы же
работать.

t:
пы серии Head Firs
Основные принци

обещали объяснить,
что там происходит
с выборкой и
контроллерами...

но
чный текст, и значитель
инается лучше, чем обы
ом
зап
ка
фи
леГра
исс
.
м
ть
Нагляднос
89 % — по данны
иятия информации (до
пр
вос
сть
я
вно
етс
кти
ща
фе
повышает эф
нятным. Текст разме
становится более по
иал
тер
ма
о,
це.
тог
е
ани
ом
едней стр
дований). Кр
под ними или на сос
ым он относится, а не
на рисунках, к котор
и разговорном стиле
ния показали, что пр
ова
лед
исс
е
ни
дав
изложения. Не
итоговом тес тирова
ение результатов на
Ра зговорный стиль
чш
улу
й)
ци
лек
х
е
ны
относитесь к себ
а (вместо формаль
бы читать лекцию. Не
изложения материал
орию, вместо того что
ист
те
вай
зы
или лекция?
ска
лом
Рас
льная беседа за сто
нии достигает 40 %.
е внимание: занимате
ваш
ет
леч
ив
пр
Что
слишком серьезно.
ничего не
илины, в вашей голове
начнете напрягать изв
не
вы
ка
По
формули,
я.
ачи
ел
читат
лжен решать зад
Активное участие
ан в результате; он до
сов
ре
нте
заи
ерзные
ть
кав
бы
и
ен
долж
димы упражнения
произойдет. Читатель
и. А для этого необхо
ям
ни
зна
а.
ми
ств
вы
чув
но
е
ь
адеват
я мозга и разны
ровать выводы и овл
твованы оба полушари
ейс
зад
ых
ор
кот
и
ни
вопросы, в реше

Все это, конечно,
хорошо, но где
информация об
альбоме?

22

введение

ания читателя.
сохранение — вним
ыпаю
Привлечение — и
у изучить это, но зас
каж дому: «Я очень хоч
страное,
Ситуация, знакомая
есн
мание на интер
. Мозг обращает вни
кой
чес
ни
на первой странице»
тех
ние сложной
неожиданное. Изуче
ее.
стр
бы
го
ное, притягательное,
узнается намно
скучным. Интересное
темы не обязано быть
инать
а способность запом
иям. Извес тно, что наш
оц
эм
к
е
ни
я. Мы
ще
ни
ра
Об
ьного сопережива
зависит от эмоционал
ре
ме
й
ьно
-то
тел
что
чи
да
зна
в
. Мы запоминаем, ког
нам небезразлично
что
то,
оэм
аем
их
ин
ом
так
зап
: речь ид ет о
ен ты зде сь ни пр и чем
тим
сен
т,
и
Не
.
пр
уем
т!»
ств
кру
чув
ес и чувство «Да я
любопытство, интер
е,
ни
вле
да
уди
ког
и
как
ил
ях,
ци
тают сложной, —
орую окружающие счи
б из
решении задачи, кот
ше , чем все зна йк а Бо
луч
зби ра ете сь в тем е
ра
что
,
ете
ма
ни
по
вы
.
технического отдела

введение

Ìåòàïîçíàíèå: íàóêà î ìûøëåíèè
Если вы действительно хотите быстрее и глубже усваивать новые
знания — задумайтесь над тем, как вы задумываетесь. Учитесь учиться.
Мало кто из нас изучает теорию метапознания во время учебы. Нам
положено учиться, но нас редко этому учат.

Как бы
теперь заставить
мой мозг все это
запомнить...

Но раз вы читаете эту книгу, то, вероятно, хотите освоить программирование для iOS, и по возможности быстрее. Вы хотите запомнить
прочитанное, а для этого абсолютно необходимо сначала понять
прочитанное.
Чтобы извлечь максимум пользы из учебного процесса, нужно
заставить ваш мозг воспринимать новый материал как Нечто
Важное. Критичное для вашего существования. Такое же важное,
как тигр. Иначе вам предстоит бесконечная борьба с вашим мозгом, который всеми силами уклоняется от запоминания новой
информации.

Как же УБЕДИТЬ мозг, что программирование
для iOS не менее важно, чем тигр?
Есть способ медленный и скучный, а есть быстрый и эффективный. Первый основан на тупом повторении. Всем известно, что даже самую скучную
информацию можно запомнить, если повторять ее снова и снова. При достаточном количестве повторений ваш мозг прикидывает: «Вроде бы несущественно,
но раз одно и то же повторяется столько раз... Ладно, уговорил».
Быстрый способ основан на повышении активности мозга и особенно
на сочетании разных ее видов. Доказано, что все факторы, перечисленные на
предыдущей странице, помогают вашему мозгу работать на вас. Например, исследования показали, что размещение слов внутри рисунков (а не в подписях,
в основном тексте и т. д.) заставляет мозг анализировать связи между текстом
и графикой, а это приводит к активизации большего количества нейронов.
Больше нейронов — выше вероятность того, что информация будет сочтена
важной и достойной запоминания.
Разговорный стиль тоже важен: обычно люди проявляют больше внимания,
когда они участвуют в разговоре, так как им приходится следить за ходом беседы и высказывать свое мнение. Причем мозг совершенно не интересует, что
вы «разговариваете» с книгой! С другой стороны, если текст сух и формален,
то мозг чувствует то же, что чувствуете вы на скучной лекции в роли пассивного
участника. Его клонит в сон.
Но рисунки и разговорный стиль — это только начало.

дальше 

23

как пользоваться этой книгой

Âîò ÷òî ñäåëàëè ÌÛ:
Мы использовали рисунки, потому что мозг лучше приспособлен для восприятия
графики, чем текста. С точки зрения мозга рисунок стоит 1024 слова. А когда
текст комбинируется с графикой, мы внедряем текст прямо в рисунки, потому
что мозг при этом работает эффективнее.
Мы используем избыточность: повторяем одно и то же несколько раз, применяя
разные средства передачи информации, обращаемся к разным чувствам — и все
для повышения вероятности того, что материал будет закодирован в нескольких
областях вашего мозга.
Мы используем концепции и рисунки несколько неожиданным образом, потому
что мозг лучше воспринимает новую информацию. Кроме того, рисунки и идеи
обычно имеют эмоциональное содержание, потому что мозг обращает внимание на
биохимию эмоций. То, что заставляет нас чувствовать, лучше запоминается — будь
то шутка, удивление или интерес.
Мы используем разговорный стиль, потому что мозг лучше воспринимает информацию, когда вы участвуете в разговоре, а не пассивно слушаете лекцию. Это
ÊËÞ×ÅÂÛÅ
происходит и при чтении.
ÌÎÌÅÍÒÛ

В книгу включены многочисленные упражнения, потому что мозг лучше запоминает, когда вы что-то делаете. Мы постарались сделать их непростыми, но
интересными — то, что предпочитает большинство читателей.
Мы совместили несколько стилей обучения, потому что одни читатели предпочитают
пошаговые описания, другие стремятся сначала представить «общую картину»,
а третьим хватает фрагмента кода. Независимо от ваших личных предпочтений
полезно видеть несколько вариантов представления одного материала.
Мы постарались задействовать оба полушария вашего мозга; это повышает вероятность усвоения материала. Пока одна сторона мозга работает, другая часто
имеет возможность отдохнуть; это повышает эффективность обучения в течение
продолжительного времени.
А еще в книгу включены истории и упражнения, отражающие другие точки
зрения. Мозг глубже усваивает информацию, когда ему приходится оценивать
и выносить суждения.
В книге часто встречаются вопросы, на которые не всегда можно дать простой
ответ, потому что мозг быстрее учится и запоминает, когда ему приходится что-то
делать. Невозможно накачать мышцы, наблюдая за тем, как занимаются другие.
Однако мы позаботились о том, чтобы усилия читателей были приложены в
верном направлении. Вам не придется ломать голову над невразумительными
примерами или разбираться в сложном, перенасыщенном техническим жаргоном
или слишком лаконичном тексте.
В историях, примерах, на картинках используются люди — потому что вы тоже
человек. И ваш мозг обращает на людей больше внимания, чем на неодушевленные
предметы.
24

введение

Беседа у камина

введение

×òî ìîæåòå ñäåëàòü ÂÛ, ÷òîáû
çàñòàâèòü ìîçã ïîâèíîâàòüñÿ
Мы свое дело сделали. Остальное за вами. Эти советы станут отправной точкой; прислушайтесь к своему мозгу и определите, что вам
подходит, а что не подходит. Пробуйте новое.

Вырежьте и прик
репите
на холодильник.

1

Не торопитесь. Чем больше вы поймете, тем
меньше придется запоминать.

Просто читать недостаточно. Когда книга задает
вам вопрос, не переходите к ответу. Представьте,
что кто-то действительно задает вам вопрос. Чем
глубже ваш мозг будет мыслить, тем скорее вы
поймете и запомните материал.
2

6

Пейте воду. И побольше.

Мозг лучше всего работает в условиях высокой влажности. Дегидратация (которая может
наступить еще до того, как вы почувствуете
жажду) снижает когнитивные функции.
7

Прислушивайтесь к своему мозгу.

Следите за тем, когда мозг начинает уставать.
Если вы начинаете поверхностно воспринимать материал или забываете только что
прочитанное, пора сделать перерыв.

Выполняйте упражнения, делайте заметки.

Мы включили упражнения в книгу, но выполнять их за вас не собираемся. И не разглядывайте
упражнения. Берите карандаш и пишите. Физические действия во время учения повышают его
8 Чувствуйте!
эффективность.
Ваш мозг должен знать, что материал книги
действительно важен. Переживайте за героев
3 Читайте врезки.
наших историй. Придумывайте подписи к
фотографиям.
Поморщиться над неудачной
Это значит: читайте всё. Врезки — часть основшуткой
лучше,
чем
не почувствовать ничего.
ного материала! Не пропускайте их.
4

Не читайте другие книги после этой перед сном.

Часть обучения (особенно перенос информации
в долгосрочную память) происходит после того,
как вы откладываете книгу. Ваш мозг не сразу усваивает информацию. Если во время обработки
поступит новая информация, часть того, что вы
узнали ранее, может быть потеряна.
5

Говорите вслух.

Речь активизирует другие участки мозга. Если
вы пытаетесь что-то понять или получше запомнить, произнесите вслух. А еще лучше — попробуйте объяснить кому-нибудь другому. Вы
будете быстрее усваивать материал и, возможно,
откроете для себя что-то новое.

9

Пишите побольше кода!

Есть только один способ научиться программировать: пишите код. Именно этим мы и будем
заниматься в книге. Программирование — это
искусство, и чтобы овладеть им, необходимо
тренироваться. Мы вам поможем: в каждой
главе есть упражнения для читателя. Не пропускайте их; во время работы над упражнениями
происходят очень важные вещи. Мы приводим
решения для всех упражнений — не бойтесь
заглянуть в решение, если окажетесь в тупике! Но обязательно постарайтесь решить
задачу, прежде чем обращаться к решению.
И обязательно добейтесь того, чтобы решение
заработало, прежде чем переходить к следующей части книги.
дальше 

25

как пользоваться этой книгой

Ïðèìèòå ê ñâåäåíèþ
Это учебник, а не справочник. Мы намеренно убрали из книги все, что могло
бы помешать изучению материала, над которым вы работаете. И при первом
чтении книги начинать следует с самого начала, потому что книга предполагает
наличие у читателя определенных знаний и опыта.

Мы начнем с готового приложения, код которого загружается
из GitHub.
Хотя эта книга посвящена программированию для iOS, мы также хотим научить
вас пользоваться некоторыми инструментами, относящимися к разработке в
целом. Итак, чтобы упростить первые шаги, мы предоставим вам полный код
приложения, который нужно будет немного изменить (а не создавать «с нуля»).

Процесс отправки приложений в книге не рассматривается.
А в предыдущих изданиях рассматривался. Но есть два обстоятельства, которые
усложняют рассмотрение этой темы: во-первых, после регистрации в программе
Apple Developer Program некоторые сведения подпадают под действие соглашения о неразглашении информации, а во-вторых, разработка iOS со временем
усложняется. В этой книге мы направили усилия на то, чтобы снабдить вас
необходимой информацией. Сейчас для того, чтобы подготовить приложение
к отправке, придется поработать больше, чем в прежние времена.

Основное внимание уделяется функциональности, которую
можно протестировать в эмуляторе.
В iOS SDK входит замечательный (и к тому же бесплатный!) инструмент для тестирования приложений на компьютере. Эмулятор позволяет проверить работу
кода без установки его на реальном устройстве или отправки в App Store. Однако
возможности эмулятора не безграничны. Некоторые нетривиальные функции
iOS невозможно протестировать в эмуляторе — например, акселерометр и компас. Соответственно, в книге эти возможности подробно не рассматриваются,
потому что мы хотим научить вас быстро и легко создавать приложения.

Упражнения ОБЯЗАТЕЛЬНЫ.
Упражнения являются частью основного материала книги. Одни упражнения
способствуют запоминанию материала, другие помогают лучше понять его,
третьи ориентированы на его практическое применение. Не пропускайте
упражнения.

26

введение

введение

Повторение применяется намеренно.
У книг этой серии есть одна принципиальная особенность: мы хотим, чтобы вы действительно хорошо усвоили материал. И чтобы вы запомнили все, что узнали. Большинство
справочников не ставит своей целью успешное запоминание, но это не справочник,
а учебник, поэтому некоторые концепции излагаются в книге по нескольку раз.

Мы постарались сделать примеры по возможности компактными.
Нашим читателям не нравится пробираться через 200 строк примера в поисках двух строк,
которые необходимо понять. Большинство примеров в книге приводится в минимальном контексте, чтобы часть, которую вы изучаете, была простой и понятной. Не ждите,
что все примеры будут идеально надежными и даже законченными — они написаны для
обучения и не всегда обладают полноценной работоспособностью.
Мы разместили код в репозитории GitHub, чтобы при необходимости вы могли скопировать все приложения и весь код, входящий в них. Код доступен по адресу:
https://github.com/dpilone/Head-First-iPhone-iPad-Development-3rd-Edition

Упражнения «Мозговой штурм» не имеют ответов.
В некоторых из них правильного ответа вообще нет, в других вы должны сами решить,
насколько правильны ваши ответы (это является частью процесса обучения). В некоторых
упражнениях приводятся подсказки, которые помогут вам найти нужное направление.

Ñèñòåìíûå òðåáîâàíèÿ
Чтобы программировать для iPhone и iPad, вам понадобится Mac на базе Intel. При написании книги мы использовали OS X версии 10.8.5 и Xcode 5.0. Впрочем, если вы работаете
со старой версией Xcode, принципиальных отличий не так уж много. Для тестирования
расширенных возможностей — акселерометра, камеры и т. д. — вам понадобится реальное
устройство iPhone, iPod Touch или iPad и сертификат зарегистрированного разработчика. В главе 1 мы расскажем, где взять SDK и документацию Apple, так что пока об этом
можно не беспокоиться.

дальше 

27

обзор команды

Íàó÷íûå ðåöåíçåíòû
Майкл Моррисон

Шон Мерфи

Джо Хек

Рич Розен
Рене Янссен Мор
рисон

Роберто Луис

Рич Р
Р
Розен — один из соавторов Mac OS X for Unix Geeks.
Также совместно с Леоном Шкларом (Leon Shklar) работал над Web Application Architecture: Principles, Protocols
& Practices — учебником по разработке нетривиальных
веб-приложений.
Шон Мерфи стал поклонником Cocoa уже более 10 лет
назад. Он участвует в проектах с открытым кодом (таких,
как Camino) и работает независимым проектировщиком
и разработчиком приложений для iOS.
Джо Хек — программист, технический директор, автор
и преподаватель с более чем 25-летним опытом работы с
компьютерами. Он пишет приложения для платформы
iPhone, начиная с первой бета-версии. Джо — основатель
Seattle Xcoders, а также автор SeattleBus — приложения
для iPhone, в реальном времени предоставляющего
информацию о движении общественного транспорта
в Сиэтле.
Эрик Шеферд начал программировать в 9-летнем
возрасте, и с тех пор не сворачивал с выбранного пути.
Он писал документацию для разработчиков с 1997 года,
а в настоящее время руководит подготовкой документации в Mozilla.

28

введение

еф е
Эрик Ш

рд

Майкл Моррисон — писатель, разработчик и автор
книг Head First JavaScript, Head First PHP & MySQL и даже
нескольких «серьезных» книг, в которых нет стрелочек,
человечков и магнитов. Майкл — основатель Stalefish
Labs (www.stalefishlabs.com), развлекательно-образовательной компании, специализирующейся на играх и
интерактивных программах, включая приложения для
iPhone.
Роберто Луис — молодой программист, которому
нравится изучать новые языки и средства разработки.
Он получил степень по информатике в университете
Autonoma de Madrid (Испания), и на протяжении своей карьеры участвовал в разработке для настольных,
мобильных и облачных систем.
Рене Янссен — мультимедиадизайнер из Нидерландов,
владелец компании Ducklord Studio. Он начал свою
карьеру как дизайнер, работал в Indesign, Photoshop и
Illustrator, но решил узнать больше и перешел к изучению
языков — от HTML, CSS, PHP и MySQL до Actionscript.
Он несколько лет проработал на Flash и Actionscript, после чего перешел к разработке iOS, Xcode и Objective-C.

введение

Áëàãîäàðíîñòè
Нашему редактору:
Мы благодарны Кортни Нэш, которая работала над всеми тремя изданиями этой книги (с 2009 года!), от начала и до конца.
Нам пришлось искать обходные пути для решения проблем
циклов выпуска Apple и это было непросто — но благодаря
Кортни у нас все-таки получилось!
Кортни Нэш

Группе O’Reilly:
Спасибо всем талантливым специалистам из O’Reilly, которые доводили до ума
наши файлы и всегда оставались «на связи», когда нам требовалась помощь.

Нашему практиканту:
Спасибо Джаянту Пратхипати — первому практиканту Element 84, который вызвался помочь нам со снимками экранов, которые необходимо было обновить для iOS7.

Нашим друзьям и семье:
Спасибо всем Пайлонам и Чедвикам, которые помогали нам с детьми и с пониманием относились к тому, что мы в неподходящие моменты усаживались за компьютеры.
Спасибо всем нашим друзьям из Element 84, которые нам помогали и делились
своим мнением.
Спасибо Полу Пайлону, который помог нам в написании кода для книги и достаточно быстро справился с обновлением материала для iOS7.
Спасибо Бретту Маклафлину, который работал рядом с нами и предоставил нам
другого специалиста, знакомого с тонкостями InDesign.
Спасибо Винни и Нику, которые во время работы над книгой ходили на тренировки по баскетболу и тэквондо. Надеемся, они уже смогут помочь нам в работе
над следующим изданием!

дальше 

29

1 Первые шаги

iOS и эпоха мобильности
Не понимаю, что все так носятся
с iPhone и iPad? Мой телефон работает не хуже, а записывать можно
и на бумаге!

С появлением iPhone мир изменился. Когда Стив Джобс
произнес эту фразу при выпуске iPhone, мало кто ему поверил.
Прошло шесть лет, и устройства iPhone и iPad используются в бизнесе и медицине, а на платформе App Store работает множество программистов — от талантливых одиночек до известных фирм. Apple
предоставляет программное обеспечение, мы поможем вам знаниями — от вас потребуется лишь энтузиазм.

приложения iOS

Èòàê, âû õîòèòå íàïèñàòü ïðèëîæåíèå äëÿ iOS...
Когда-то разработка мобильных приложений считалась экзотикой, одним из самых передовых
(и даже модных) направлений. Эти времена прошли. Мобильные приложения получили повсеместное распространение. Сейчас в мире насчитывается более 500 миллионов устройств iOS.
Создавая приложение для iOS, вы получаете миллионы потенциальных пользователей (пусть даже
довольно требовательных).
На заре эпохи мобильной разработки можно было обойтись простым «фонариком» или приложением, издававшим звуки при нажатии кнопки. Сегодня пользователи ждут от вас большего. Они
хотят видеть графику высокого разрешения, поддержку разных вариантов ориентации устройства и
быстрые, надежные приложения. А теперь хорошая новость: беритесь за книгу, изучайте примеры,
пишите свой код — и ваше имя появился в iTunes App Store рядом с названиями таких компаний,
как EA Games, и самой фирмы Apple!

32

глава 1

iOS и эпоха мобильности

Äîáðî ïîæàëîâàòü âî Âñåëåííóþ Apple!
Вероятно, вы уже в курсе, что Apple все делает по определенным правилам. iTunes,
электронный магазин для приложений, был первым в своем роде. Чтобываше
приложение продавалось в App Store, вы должны написать его в среде Xcode на
Mac, а затем отправить через iTunes Connect (портал для отправки и отслеживания приложений iOS). Далее приложение должно быть одобрено экспертами
Apple из Калифорнии, и только после этого оно появится в App Store.

Да, этим действительно
занимаются
живые люди.
Мы общались
с ними... чаще, .
бы
чем хотелось

Xcode

ение
Ваше прилож

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

33

iOS без Objective-C не бывает

Ïðèëîæåíèÿ iOS ïèøóòñÿ íà ÿçûêå Objective-C
Вы уже работали на других языках программирования, так что многие концепции,
с которыми нам придется иметь дело, покажутся знакомыми. Objective-C — объектноориентированный язык, созданный на базе C. Принципиально новых концепций
не так много, и это хорошо. Впрочем, есть и плохие новости: синтаксис Objective-C
на первый взгляд может показаться запутанным. Вероятно, вам придется какое-то
время поломать голову. Не волнуйтесь, у вас все получится.

Objective-C ïîõîæ íà Java.
Объектно-ориентированный язык, уходящий корнями в Smalltalk.

Objective-C èñïîëüçóåò çíàêîìûé ñèíòàêñèñ.

Objective-C
В синтаксисе
ется преча
ре
часто вст
те: это
фикс NS. Знай
tep!
TS
eX
наследие N

Так как язык создавался на основе C, в нем используются знакомые
по C конструкции циклов, типов, указателей и т. д. Objective-C продолжает линию наследия Apple, начавшуюся с системы NeXTStep,
за которой последовала система OpenStep, и наконец, CocoaTouch.

Objective-C èñïîëüçóåò áèáëèîòåêè CocoaTouch.
Если вы занимались программированием Mac, то вы уже знаете
Objective-C. Впрочем, вам предстоит узнать еще немало того, что
относится к специфике iOS.

Óïðàâëåíèå ïàìÿòüþ ìîæåò îñóùåñòâëÿòüñÿ àâòîìàòè÷åñêè.
В iOS5 компания Apple наконец-то представила механизм автоматизации управления памятью(по аналогии с Java), называемый
автоматическим подсчетом ссылок (ARC, Automatic Reference
Counting). А значит, вам уже не придется возиться с подсчетом
ссылок для предотвращения утечки памяти.

34

глава 1

iOS и эпоха мобильности

Âñå íà÷èíàåòñÿ ñ SDK

Software
t
Development Ki

Чтобы программировать на Objective-C, вам понадобится Mac и среда Xcode.
Средства разработки распространяются бесплатно, а установить их несложно. Зайдите в магазин Mac App Store и найдите в нем Xcode. При написании
книги использовалась версия Xcode 5.0.

Найдите
Xcode

Загрузите!

После загрузки Xcode помещается в папку Applications. В действительности
Xcode представляет собой целый пакет, объединяющий множество приложений, включая компиляторы. О том, какие еще приложения входят в пакет
Xcode, будет рассказано позднее, а пока просто запустите его. Для этого
откройте папку Applications в Finder или воспользуйтесь Spotlight.

Çàêðåïèòå Xcode íà äîê-ïàíåëè — ïðèãîäèòñÿ íà áóäóùåå
После того как вы впервые запустите Xcode, не поленитесь
и добавьте значок Xcode на док-панель. Мы будем постоянно использовать среду разработки в книге. Щелкните на
значке Xcode, удерживая клавишу Ctrl, выберите команду
«Options», а затем команду «Keep in Dock».

дальше 

35

знакомьтесь: gitHub

Ýòî Ñüþ, âàø íîâûé íà÷àëüíèê
Вы только что поступили на работу в новую фирму, занимающуюся разработкой для iOS, и получили свое первое задание: внести изменения в почти
готовое приложение для Twitter. Мы непременно расскажем все, что для
этого необходимо знать, а вам представился хороший шанс отличиться.

Сью из тех
начальников, котор
ые считаю
т,
что новичо
к должен
сразу брат
ься за дело...

Весь наш код хранится
в GitHub, так что загружай InstaTwit и
берись за дело. Я расскажу, что нужно
исправить, чтобы мы могли выпустить
приложение. Отдел маркетинга хочет
внести пару изменений.

А это GitHub

Без паники,
сейчас все
объясним.

часто

В:
О:

Задаваемые
вопросы
Что такое GitHub?

GitHub — площадка для «социального программирования». Это
сайт, на котором размещаются миллионы репозиториев Git, многие
из которых являются общедоступными. GitHub отлично подходит
для распределенных команд и проектов с открытым кодом. И еще

36

глава 1

здесь удобно хранить код для книг. Вы найдете на GitHub все примеры кода из книги, включая код этого проекта. Для управления
исходным кодом используется система Git; это означает, что вы
можете загрузить копию кода, необходимого для работы с книгой,
и отслеживать все вносимые изменения. А если что-то пойдет
не так, то неудачное изменение всегда можно будет отменить и
вернуться к предыдущей версии.

iOS и эпоха мобильности

Xcode è Git... íåðàçëó÷íûå äðóçüÿ
Xcode — среда разработки для создания приложений iOS. GitHub — сетевой репозиторий кода программных проектов (использующий Git). Эти инструменты упрощают жизнь групп разработки: вы работаете
над проектом самостоятельно, но используете код, написанный другими участниками. Учетная запись
GitHub для этого не потребуется, но если она у вас есть — не стесняйтесь, создавайте новую ветвь и используйте код.
1

Не создавайте новый проект — он уже существует.
На начальном экране Xcode вам предлагается создать новый проект
или подключиться к уже существующему. В данном случае следует
выбрать второй вариант («Check out an existing project»).

Выберите
.
этот вариант

2

Клонируйте содержимое репозитория.
Далее необходимо сообщить Xcode местонахождение кода. В нашем случае введите адрес https://github.com/dpilone/Head-First-iPhone-iPad-Development-3rd-Edition.git.
Введите
д
адрес
др
р в нижнем поле и щелкните
щ
на кнопке Next.

дальше 

37

структура кода

3

Выберите нужный вариант.
Код книги организован так, что вы можете либо загрузить код
отдельной главы, либо полный архив кода всей книги. Чтобы открыть код конкретной главы, откройте соответствующий раздел
(в данном случае главу 1).

е
м раздел
В главно держится
со
(master)
од книги.
полный к нения в нем
ж
Все упра нены —
ол
уже вып ывайте!
д
я
гл
д
о
п
не

Откройте этот раздел,
чтобы работать с кодом
главы 1.

4

ыбе
ери
р те п
рите
р ектт.
роек
ро
Выберите
проект.
дел содержит несколько проектов
Раздел
проектов, но в данный момент нас и
интересует
только проект InstaTwit. Выберите его и щелкните на кнопке Open.

т
ен проек йте его.
Нам нуж
кро
т
о

it
InstaTw

Сетевой репозиторий GitHub используется многими проектами —
как закрытыми, так и распространяемыми с открытым кодом.
38

глава 1

iOS и эпоха мобильности

Xcode íàõîäèòñÿ â öåíòðå ëþáîãî ïðîåêòà iOS
Xcode — полнофункциональная интегрированная среда разработки (IDE). Разработчик использует Xcode
для редактирования кода и построения пользовательских интерфейсов, а также для работы с документацией. В Xcode входит полноценный отладчик, компилятор, поддержка контекстного редактирования,
статический анализатор кода, система выдачи рекомендаций и предупреждений по качеству кода, а также
средства контроля версий на базе Git или Subversion.
Элементы
Здесь выбирается модель
построения; пока мы будем
использовать эмулятор, потом перейдем на физическое
устройство.

Здесь в Xcode отображается редактор графического интерфейса.

управления для
настройки представления,
включая добавление консоли и вспомогательных
редакторов для вывода
кода.

Здесь перечисляются файлы
проекта с указанием используемых библиотек, пакетов
и т.д.

РАССЛАБЬТЕ

СЬ

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

Библиотека объектов Xcode: отсюда
элементы перетаскиваются мышью
в представление.

дальше 

39

пробный запуск

Тест-драйв
1

Постройте и запустите код проекта.
Убедитесь в том, что для проекта выбрана схема эмулятора «InstaTwit»
iPhone Retina (4-inch).
Чтобы программа заработала,
достаточно нажать одну кнопку!

2

Щелкните на кнопке Build and Run.
Она выглядит как кнопка воспроизведения на бытовых проигрывателях.

3

Включите режим разработчика.
В этот момент на экране может появиться окно с предложением
включить режим разработчика. Включите его — иначе вам придется
снова и снова вводить свой пароль!

часто

В:
О:

Еще раз — что такое Git?

Git — система управления версиями,
изначально созданная для разработки Linux.
Она отличается от Subversion или CVS тем,
что каждая локальная копия репозитория
сам по себе является полным репозиторием. По этой причине система Git более
надежна в условиях распределенных групп
асинхронной разработки. Дополнительная
информация о системе Git и ее командах
приведена по адресу http://git-scm.com/
about.

40

глава 1

В:
О:

Задаваемые
вопросы
И как Git относится к GitHub?

Git — система управления версиями,
которая может устанавливаться локально
на одном компьютере или на приватном
сервере для удаленного доступа. GitHub —
общедоступный сетевой репозиторий для
проектов Git.

В:
О:

А как же Subversion?

Subversion также поддерживается
в Xcode. Если вы работаете с Subversion,

вы можете использовать тот же рабочий
процесс (и URL-адрес), но в книге система
Subversion не задействована, и для кода
InstaTwit необходимо использовать Git.

В:

Как еще среда Xcode связана
с Git?

О:

Xcode использует Git для отслеживания
изменений в файлах. Измененные файлы
помечаются специальным значком; разработчик может закрепить изменения прямо
из Xcode и даже сравнить старые файлы
с новыми.

iOS и эпоха мобильности

Ýìóëÿòîð iOS
Эмулятор запускается автоматически при первом построении
и запуске приложения. Он поддерживает основные операции
с устройством, не ограничивающиеся простыми прикосновениями
к экрану, включая повороты, создание снимков экрана для отправки
приложения на рецензирование и встряхивание устройства для
проверки акселерометра.
отображаПредставление,
е iOS, —
ор
ят
емое в эмул
иложепр
е
но
ль
де
от
это
скается
пу
за
ое
ние, котор
.
автоматически

И хотя изображени
е напоминает
экран телефона, эм
улятор iOS
также поддержива
ет iPhone 4s,
iPhone 5s, а такж
е iPad с экраном Retina (и без не
го).

Я-то думала, что будет
сложно! Но стоило нажать пару
кнопок, и все заработало!

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

дальше 

41

процесс построения

Построение в Xcode:
под увеличительным стеклом
ьно
Формал вля- 1
это не я тью
с
ется ча
процесса ия,
н
построе хое
но мы н одить
х
тели об м
е
и
н
а
м
и
вн
том,
вопрос о зялся
в
а
откуд
2
код...

Загрузка проекта с GitHub.
Выше этот шаг подробно не описывался, но среда Xcode загрузила исходный код
с GitHub. Впрочем, загружается не только код на языке Objective-C, но также полное описание проекта, макет рабочей области, значки и графические элементы,
используемые в приложении. Все эти данные являются частью проекта Xcode.

Компиляция классов проекта.
Класс Objective-C обычно состоит из файлов .h и .m, содержащих заголовок и реализацию соответственно. Файл заголовка описывает открытый интерфейс класса — его API. Файл реализации содержит «суть» класса: то, благодаря чему класс
выполняет свою работу. Эти два файла объединяются и компилируются в двоичную
форму в процессе построения.

+

42

глава 1

3

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

4

Компоновка кода библиотек.
В приложениях iOS используется большой объем кода общих библиотек: отображения пользовательского интерфейса (UIKit), картографической поддержки
(MapKit), низкоуровневого кода графического вывода (CoreGraphics) и т. д. Apple
называет эти общие библиотеки инфраструктурами (frameworks). Инфраструктуры
содержат не только общий откомпилированный код (как, например, файлы JAR
или .so в других языках). В Objective-C инфраструктуры могут содержать заголовочные файлы, графические ресурсы и т. д. Некоторые инфраструктуры — такие,
как MapKit, — подключаются только в том случае, если они используются приложением; другие — такие, как CoreGraphics, — являются обязательными, поскольку
все приложения зависят от содержащегося в них кода.

iOS и эпоха мобильности

Построение в Xcode: под увеличительным
стеклом (продолжение)
5

Упаковка откомпилированного кода, графики и т. д.
Если вы никогда не работали с приложениями OS X или iOS, знайте, что SomeApp.
app — всего лишь каталог с особым содержимым. Приложение iOS представляет
собой папку с откомпилированным исполняемым файлом, набором конфигурационных файлов и всеми ресурсами, необходимыми для работы приложения. Структура
каталогов более подробно рассматривается ниже.

6

Если приложение устанавливается на устройстве, код снабжается
цифровой подписью.
Установка на устройства — во всех случаях, от простого тестирования на вашем
личном устройстве до отправки в App Store — проходит под управлением сертификатов, сгенерированных на базе ваших удостоверений разработчика. Так экосистема iOS следит за тем, какие программы могут устанавливаться на устройствах. Для
управления сертификатами используется служебная программа-организатор, а для
сопоставления приложений с устройствами — система профилей.

Пока приложение запускается
в эмуляторе,
так что этот
шаг для нас еще
не актуален.

Все профили
в установке.

7

Приложение устанавливается в эмуляторе.
Эмулятор ведет себя как реальное устройство. Он тоже содержит каталог для хранения данных, приложения тоже создают свои каталоги с использованием идентификаторов, и т. д. Мы еще поговорим об этом позднее, но помните: все это происходит
при нажатии кнопки Build and Run...

8

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

И правда,
немало...

дальше 

43

в поисках изменений

Хорошо — я вижу, у тебя все готово. Нам
нужно изменить текст сообщений — отдел маркетинга хочет представить наше приложение
как средство экономии времени.

Поиск помогает в решении многих
проблем.
Это изменение не столь значительное
(мы изменяем статический текст, жестко
запрограммированный в приложении).
Как проще всего определить, где находится код с нужным текстом? Конечно,
воспользоваться поиском. Мы будем искать
слово «awesome», встречающееся в одной
из надписей.
ь,
Щелкните здес
ь
ыт
кр
от
чтобы
диалоговое окно
поиска.

Вот оно!

44

глава 1

Условие
поиска.

iOS и эпоха мобильности

Ïðîãðàììà õðàíèòñÿ â ôàéëàõ ñ èñõîäíûì êîäîì
Код приложения делится на классы, а каждый класс состоит из двух файлов: заголовочного файла (.h)
и файла реализации (.m). Заголовочный файл (.h) определяет открытый программный интерфейс (API)
класса, тогда как файл реализации (.m) определяет, как именно класс делает то, что полагается. Наша
задача относится к данным, выводимым классом, а не к его API.
Этот метод вызы
вается инфрастр
уктурой
непосредственно по
сле загрузки предс
тавления.
Он предназначен дл
я настройки предс
тавления
перед его отображе
ни
массива заполняютс ем. В данном случае два
я значениями, кото
отображаются на
рые
спиннере.

реализаОдин из методов
idLoad.
wD
vie
од
т
ме
ции —

- (void)viewDidLoad {
[super viewDidLoad];
self.activities_ = @[@”sleeping”, @”eating”, @”working”,
@”thinking”, @”crying”, @”begging”, @”leaving”, @”shopping”,
@”hello worlding”, nil];
self.feelings_ = @[@”awesome”, @”sad”, @”happy”,
@”ambivalent”, @”nauseous”, @”psyched”, @”confused”, @”hopeful”,
@”anxious”, nil];
}

приложеВ этом простом сохрао
т
ос
пр
нии текст
массиве,
м
но
ыч
об
в
ся
няет
рианты.
ва
ие
уг
др
но есть и

InstaTwitViewController.m
О синтаксисе мы еще поговорим позднее,
а пока достаточно сказать, что перед
вами массив строк Objective-C — экземпляров класса NSString.

Мозговой
штурм
InstaTwitViewController.h — заголовочный файл этого класса; он
объявляет открытый интерфейс класса, то есть его общедоступные
свойства и действия. Если вам интересно, откройте заголовочный
файл и посмотрите сами.

дальше 

45

обновление текста

Записка от Сью ми
на
с новыми терми

Упражнение!
Внесите следующие изменения
в кодовую базу.
книге
жно удалить, в
Код, который ну я перечеркиванием.
ьс
будет обозначат

- (void)viewDidLoad {

:
енить
но изм
ж
у
н
й
ры
, кото
яем,
Текст
т удал
с
к
е
и
т
новым
арый
ссивы
а
• Ст
м
м
яе
заполн
и...
,
м
ы
н
orking
дан
— netw
s
ie
,
it
g
iv
in
t
m
ссив ac
wirefra
• Ма
eeting,
g,
w
t
in
,
h
g
c
codin
g, pit
in
t
e
e
g, m
e
workin
g mobil
g, goin
in
e,
pivot
wesom
gs — a
n
ndly,
li
e
ie
e
r
f
f
ссив
agile,
,
t
r
a
• Ма
fficient
nt, sm
peful, e
o
confide
h
,
d
e
psych
savvy,

[super viewDidLoad];
self.activities_ = @[@”sleeping”, @”eating”,
ing” @”working”,
ing
@”working”
@
working
@”thinking”
@
@”thinking”,
thinking
@”crying”, @”begging”, @”leaving”, @”shopping”, @”hello worlding”,

@”networking”, @”coding”, @”tweeting”, @”wireframing”, @“working”,
@“meeting”, @”pitching”, @”pivoting”, @”going mobile”, nil];
self.feelings_ = @[@”awesome”, @”sad”, @”happy”, @”ambivalent”,
@”nauseous”, @”psyched”, @”confused”, @”hopeful”, @”anxious”, @”awesome”,

@”confident”, @”smart”, @”agile”, @”friendly”, @”savvy”, @”psyched”,
@”hopeful”, @”efficient”, nil];
}

Полужир
н
шрифто ым
м обозна
чается
до
мый код бавляе.

Задаваемые
вопросы

В:

Мне всегда придется строить приложение, чтобы его
протестировать?

О:

Да, некоторые языки (например, Ruby и JavaScript) обходятся
без компиляции, но Objective-C — компилируемый язык. Чтобы
протестировать изменения, необходимо построить приложение,
установить его на эмулятор (или реальное устройство) и запустить.
В Xcode реализована качественная поддержка модульного и функционального тестирования, а служебная программа Instruments
может использоваться для полного тестирования взаимодействий
с приложением. Автоматизированные тесты ускоряют цикл тестирования и избавляют от необходимости построения и запуска всего
приложения, но не заменяют комплексного тестирования.

46

глава 1

InstaTwitViewController.m

часто

В:

Насколько важно протестировать программу на реальном
устройстве? Можно ли ограничиться эмулятором?

О:

Эмулятор способен на многое. Большую часть тестов вы будете
выполнять в эмуляторе (впрочем, это зависит от приложения). И все
же существуют различия между запуском программы в эмуляторе
и на реальном устройстве. В какой-то момент придется перейти
на устройство, причем лучше сделать это рано, чем поздно. О том,
какие возможности не поддерживаются эмулятором, будет рассказано в следующих главах. Но даже если вы уверены, что эмулятор
поддерживает нужные функции, тестирование производительности
всегда следует проводить на реальном устройстве — никогда не
полагайтесь на производительность эмулятора при тестировании
приложений.

iOS и эпоха мобильности

Возьми в руку карандаш
Что делают эти методы? Вы уже знаете, что делает метод
viewDidLoad; теперь взгляните на другие методы из файла .m
и напишите, что они, по вашему мнению, делают.

- (IBAction) textFieldDoneEditing: (id)
sender {
[sender resignFirstResponder];
}

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == 0) {
return [activities_ count];
}
else {
return [feelings_ count];
}
}

- (IBAction) tweetButtonTapped: (id) sender {
NSLog(@”%@”, @”Tweet button tapped!”);
NSstring...

тода.
Это не весь код ме
ь его
ет
тр
мо
Чтобы прос
йьзу
ол
сп
во
е,
ни
же
ол
прод
тесь Xcode.

Если код Objective-C выглядит непривычно, не огорчайтесь...

РАССЛАБЬТЕ

СЬ

Мы всего лишь хотели дать общее представление о структуре кода
Objective-C. Если вы в общих чертах понимаете, что здесь происходит, — хорошо, но в книге Objective-C будет рассматриваться более
подробно. Бояться пока нечего.

дальше 

47

решение упражнения

Возьми в руку карандаш
Решение

Некоторые методы из файла InstaTwitViewController.m.

- (IBAction) textFieldDoneEditing: (id)
sender {

TextField

[sender resignFirstResponder];
}

picker

Это метод обратного вызова, который присоединяется к текстовому полю (вскоре вы
узнаете, как это делается...). Когда пользователь завершает редактирование текстового поля, компонент отправляет оповещение resignFirstResponder. Позднее статус
«первого ответчика» (FirstResponder) будет
рассмотрен более подробно.

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
if (component == 0) {
return [activities_ count];
}
else {
return [feelings_ count];
}

sendButton

Компонент выбора запрашивает у контроллера представления, сколько строк
в нем должно отображаться.
В нашем случае оно зависит
от количества элементов
в массивах activities и feelings.

}
При нажатии кнопка должна что-то де- (IBAction) tweetButtonTapped: (id) sender { лать. Как и в случае с текстовым полем,
кнопка инициирует действие, с которым
NSLog(@”%@”, @”Tweet it button
tapped!”);
связывается фрагмент кода. В нашем
примере код выводит в журнал комментаNSstring...
рий. О том, как просмотреть содержимое
этого журнала, будет рассказано далее. (Код
публикации в Twitter в листинге не показан.)

48

глава 1

iOS и эпоха мобильности

Тест-драйв
Итак, мы нашли код, который необходимо изменить в данном
приложении. Внесите изменения и постройте приложение заново.

1

Запустите Xcode и внесите изменения в текст.
Вернитесь на пару страниц назад к файлу
InstaTwitViewController.m и внесите изменения, показанные на странице.

2

Сохраните приложение и постройте его заново.
После изменения текста повторите процедуру построения и запуска.

3

Настройте учетную запись Twitter в эмуляторе.
Если вы хотите, чтобы сообщения действительно появлялись в Twitter, нажмите кнопку Home в эмуляторе,
перейдите к настройкам и введите данные своей учетной
записи. Затем вернитесь к приложению и отправьте
сообщение!

Xcode может существенно помочь
с отладкой, если в приложении
возникли проблемы....
дальше 

49

Xcode помогает в отладке

Ðåäàêòîð êîäà, öåíòð óïðàâëåíèÿ... äà åùå è îòëàä÷èê
Каждый из нас хоть иногда да ошибается при вводе или не замечает,
когда его код остается незавершенным. Наверняка и вы сталкивались с
ошибками и предупреждениями в редакторе. Xcode старается следить
за происходящим во время написания кода и выдает ошибки и предупреждения еще до того, как вы перейдете к построению программы.
Переключите навигатор
в потоковое представление.

ния

режде

п
Преду

Здесь выводят
ся
предупреждени
я
ошибки постро и
ения

...

Ошиб
ки

...и здесь тоже

Здесь вы узнаете о потоках
и обращении к
стеку.
Точка останова
появится на полях (если, конечно,
вы ее поставили)

вления для запу
Элементы упра отладочном
в
ска приложения приостановка,
и
ск
пу
за
е:
им
реж
ение с обходом
лн
по
вы
пошаговое
ение
ов
аг ое выполн
процедур, пош едуры и т. д.
оц
с заходом в пр

Здесь выводится дополнительная информация о том,
что именно происходит
в приложении.

Когда программа заработает, вы также можете воспользоваться полнофункциональным отладчиком Xcode
для выявления возможных проблем. Вы можете устанавливать точки прерывания, щелкая на боковых
полях, включать отслеживание переменных, а при достижении программой одной из установленных
точек прерывания — проверять значения переменных и выполнять код в пошаговом режиме.
50

глава 1

iOS и эпоха мобильности

Отлично! Осталась одна мелочь. Отдел
маркетинга прислал новый значок
приложения. Заменим его — и можно
подавать на утверждение.

Обратили внимание на старый значок?
Никакой фантазии у людей, все та же унылая птичка. Чтобы привлечь внимание технарей, отдел
маркетинга предлагает использовать символ @
в модном восьмибитном ретро-стиле.

Xcode позволяет легко сменить значок
приложения.
В Xcode графика рассматривается как ресурсы
приложения. С каждым приложением (даже с этим)
связываются различные ресурсы, от значков до
изображений высокого разрешения и встроенных
видеороликов.
Xcode помогает упорядочить изображения (с возможностью просмотра многих видов графики),
а затем упаковывает и осуществляет преварительную обработку для использования в приложении.

дальше 

51

добавление значков

Îäèí iPhone, äâà iPhone, êðàñíûé iPhone, ñèíèé iPhone...
В Xcode щелкните на имени главного проекта, чтобы вызвать страницу
со сводной информацией. На этой странице отображается различная
информация высокого уровня: данные развертывания, некоторые изображения, номера версий. Кроме того, с этой страницы можно перейти
к каталогуу р
ресурсов
ур
((Asset Catalog)
g) приложения.
р

гка пре го
мы сле
е
Ладно, и, но друг мо т
л
ае
и
н
ч
з
и
л
о
е
в
у
рил, чт орая
о
в
о
г
а
кот
друг
нщину,
аодну же , что Apple р ися
а
м
л
и
и
р
щ
тя
гово
над све
...
ботает те моделями
о
н
м
е
вт

Зде
с
бир ь выает
про
с
ект я
.

Нажмиу
те кнопк й,
о
к
ел
р
со ст
чтобы от л
й
а
ф
ь
т
кры
log и
Asset Cata
реть
просмот
значки.

Каталоги ресурсов — это специализированные файлы для хранения графики непосредственно в приложении. На этой странице отображается удобный графический интерфейс для управления значками.
Аналогичные интерфейсы используются для управления заставками и прочей графикой.

Значки по
умолчанию,
унаследованные
от клонированного проекта.

52

глава 1

Чтобы выполнить операции
с изображением,
щелкните внутри
прямоугольника.

iOS и эпоха мобильности

Конечно, различия между iPhone
и iPad не ограничиваются размером
значков? Давайте угадаю — скоро вы
об этом расскажете подробнее?

Безусловно! Мы будем разбираться
с различиями устройств по ходу дела.
Разные устройства и разные поколения одного устройства
обладают разными возможностями. iOS обычно старается
скрыть такие подробности от пользователя. Например,
при построении макета пользовательского интерфейса на
экране Retina iOS будет автоматически выводить графику
в более высоком разрешении. Тем не менее некоторые
моменты желательно принимать во внимание: различия в
размерах значков, наличие или отсутствие камеры и т. д.
Мы будем попутно упоминать о них.

Тест-драйв
1

Найдите значки из клонированного проекта.
Код, клонированный из GitHub, содержит дополнительные значки. Воспользуйтесь Finder и перейдите к месту
сохранения клонированного кода.

2

Перетащите файлы в Asset catalog.
Возьмите новые значки и перетащите их из Finder.
Файлы значков называются square-new-icon-60.png и squarenew-icon-120.png.

3

Удалите приложение из эмулятора.
Чтобы убрать старый значок, войдите в эмулятор, нажмите кнопку Home и щелкните на значке InstaTwit. Когда
значок начнет дрожать и появится маленькая кнопка «x»,
щелкните на ней для удаления приложения.

4

Постройте и запустите приложение в Xcode.
Снова щелкните на кнопке запуска. Приложение строится и заново устанавливается в эмуляторе с новым
значком. Нажмите кнопку Home, и вы увидите его!
дальше 

53

тест-драйв

Тест-драйв
Новый эффектный значок появляется на домашнем экране!

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Xcode занимает центральное место в разработке для iOS.



Xcode — мощная интегрированная среда с документацией, средствами отладки и редакторами пользовательского интерфейса.



54

Эмулятор удобен, но у него есть свои ограничения; тестирование следует проводить на
реальном устройстве.

глава 1



Для установки приложения на устройство необходимо быть участником платной программы
Apple Developer.



Поддержка Git встроена в Xcode.



Помните о различиях в функциональности
устройств при построении приложения.

iOS и эпоха мобильности

А как было бы замечательно, если бы
приложение можно было установить на
iPhone вместо эмулятора? Но это, конечно,
только мечты…

дальше 

55

программа Apple Developer

Это возможно. Только заплатите $99 компании Apple.
И это не шутка. Чтобы установить приложение на устройство, необходимо
решить ряд задач, связанных с безопасностью, создать необходимые сертификаты и профили. Для доступа к этим механизмам необходимо зарегистрироваться в платной программе разработчиков для iOS. За дополнительной
информацией обращайтесь по адресу: http://www.apple.com/iosdeveloper.
В этой книге мы ограничимся эмулятором, так что читателям платить
за участие в программе не обязательно.
есь

одит
Вы нах
.
ь
с
зде

Ваше приложение
на вашем
устройстве
(и только).

Хотите большего? Заходите на сайт!
56

глава 1

iOS и эпоха мобильности

Я просмотрела изменения —
все отлично. Отправляйте!

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

дальше 

57

ГЛАВА I

Âàø èíñòðóìåíòàðèé ðàçðàáîòêè äëÿ iPhone
Глава 1 осталась позади, а ваш
инструментарий пополнился основными
концепциями программирования для iOS.

Прил
о

жени

Xcode

тегная ин
ь
л
а
н
о
кци
отки
нофун
разраб
а
д
е
 Пол
р
с
ия
нная
ирован
рирова
ограмм
р
п
я
л
(IDE) д
ac.
iOS и M
ом,
им код
ш
а
в
т
авляе
инфра
 Упр
емыми
а
ами
ч
с
ю
р
у
л
с
к
под
и и ре
м
а
р
у
т
струк
ения.
ж
о
л
при
польактор
д
е
р
й
ейро енны
нтерф
 Вст
кого и
с
ь
ета
л
к
е
а
ия м
зоват
троен
с
о
вания
п
ы
я
з
са дл
и свя
я
и
н
е
авл
предст
.
ентов
н
о
комп

я iOS

 Д
олжн
ы по
лам
и огр дчинять
с
анич
 П
ения я правирохо
м
App
дят
le.
вани
проц
я пе
е
сс р
ред
е
Stor
ц
е
д
нзир
опус
e.
о
ком
в Ap  Д
p
олжн
подп ы имет
ь ци
ись
фро
дл
зиче
вую
ском я устан
о
вки
уст
 П
на ф
р
о
й
ишу
ств
ится
е.
на я
зыке
Obje
ctive
-C.

тор
Эмуля подходит для бы-

.
красно
ования
 Пре
естир
т
о
г
о
стр
енной
гранич
о
я
т
е
а
ад
ровани
 Обл
тести
й
о
,
к
и
ж
т
мя
поддер
ра, па
ромет
е
и, GPS
л
е
т
с
с
к
о
а
ельн
т
и
д
о
в
произ
ры.
и каме

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Xcode занимает центральное место в разработке
для iOS.



Xcode — мощная интегрированная среда с документацией, средствами отладки и редакторами
пользовательского интерфейса.



58

глава 1

Эмулятор удобен, но у него есть свои ограничения; тестирование следует проводить на
реальном устройстве.



Для установки приложения на устройство необходимо быть участником платной программы
Apple Developer.



Поддержка Git встроена в Xcode.



Помните о различиях в функциональности
устройств при построении приложения.

2 Основные паттерны iOS

Строим приложение «с нуля»
Да не так уж много времени
понадобилось. Пара дней на
подготовку — и дело в шляпе...

Итак, первое знакомство состоялось; теперь пришло время
начать все заново. Вероятно, вы уже примерно представляете, с какими
инструментами вам предстоит работать и как устроена среда Xcode. Пора
изучить проблему более основательно и построить собственный проект. Как
создать проект iOS, как связаны друг с другом компоненты приложений, на
какие схемы взаимодействий следует ориентироваться? Вы это скоро узнаете — а пока переверните страницу...

iOS и mvc

Ïðèëîæåíèÿ iOS ðàáîòàþò â ïîëíîýêðàííîì ðåæèìå
Одно из принципиальных отличий устройств iOS (например, iPhone или iPad) перед настольными и портативными компьютерами заключается в том, что их приложения всегда работают в полноэкранном режиме. Более того, в первых моделях iPhone никакой многозадачности не было вообще. Впрочем, со временем она появилась, но это не та многозадачность,
которая знакома нам по настольным компьютерам. Пользователь в любой момент времени взаимодействует только с одним приложением через представление, которое отображается на экране.
При этом приложение незаметно для пользователя распределяет обязанности по работе приложения
между парой функциональных блоков, изображенных на следующей диаграмме.
Представлени
е
Компонент

едставляет
Компонент пр еского инич
аф
гр
т
элемен
торым взаитерфейса, с ко льзователь
по
модействует
опку). Обычно
кн
,
ер
м
ри
ап

в редакторе
он создается
e, но такod
GUI среды Xc
роиться и на
же может ст
уровне.
м
программно

Модель

Модель содерж
ит
данные, необхо
димые для работ
ы
приложения; в
приложениях iOS
эт
источник данн о
ых,
работающий
с
базами данных
,
списками plist
,
графическими
из
бражениями, ве обслужбами или
любой
другой необходи
мой
информацией.

60

глава 2

Источник
данных

Контрол

лер

Делегат

логика
е собрана
м инфорВ делегат
о
к
о
за пот
азвание
н
контроля
отсюда и
мации — ер». Он сохраняет
л
«контрол ает информацию, а
ж
а
бр
о
тем, когд
и от
управляет ие должа также
ен
редставл риложение
и какое п

ся
ь
т
а
у
ж
а
но отобр остроено по образц вя
п
м
it
о
w
т
T
а
a
Inst
(делег
),
ттерна
этого па aTwitViewController
st
в,
In
о
л
й
ся
а
ляет
ена ф
сняет им нам.
что объя
я
ес
и
вш
а
еч
уже встр

основные паттерны iOS

Ïàòòåðí Ìîäåëü-Ïðåäñòàâëåíèå-Êîíòðîëëåð
Паттерн «Модель-Представление-Контроллер» (MVC, Model View
Controller) подробно рассматривался в книге Э. Фримена «Паттерны проектирования» (СПб., Питер, 2011). Он часто встречается в приложениях с
графическим интерфейсом и повсеместно используется в инфраструктуре
Cocoa Touch. В архитектуре MVC обязанности приложения разбиваются
на отображение информации для пользователя (представление), управление нижележащими данными (модель) и реакцию на взаимодействия с
пользователем (контроллер). Такое деление упрощает логику приложения
и позволяет повторно использовать большие фрагменты кода независимо
от конкретного устройства (то есть как на iPhone, так и на iPad).

й
андартны
MVC — ст роектироп
паттерн рый вовсе
о
т
о
к
,
я
вани
разчивается и
не ограни
р
п
а
Н
.
S
iO
работкой око примеир
мер, он ш uby on Rails.
R
в
ся
няет

Кто и что делает?
ае
ае
Соедините каждый компонент MVC с функцией, которую он
выполняет в приложении iOS.

Компонент
Модель

Представление

Контроллер

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

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

дальше 

61

кто и что делает? ответ

Кто и что делает?
ае
ае
решение
Соедините каждый компонент MVC с функцией, которую он
выполняет в приложении iOS.

Компонент

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

Модель

Представление

Отвечает за данные. Информация
может храниться локально или в
облаке, с использованием списков
pklist, баз данных, веб-служб и т. д.
Отвечает за координацию ответов на
действия пользователя или события,
происходящие в приложении. Своего рода
«регулировщик», управляющий информационными потоками в приложении.

Контроллер

часто

Задаваемые
вопросы

В:

В каждом приложении iOS есть модель, представление
и контроллер?

О:

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

В:

Я не вижу в коде InstaTwit ничего похожего на модель.
Она там есть?

62

глава 2

О:

Одна из трудностей с кодом iOS и многих примеров заключается в том, что обязанности модели часто возлагаются на контроллер.
В итоге появляется огромный контроллер представления, который
пытается делать «все сразу». Сопровождение такого кода превращается в сущий кошмар. А вы видите, где в InstaTwit проявляется
эта проблема?

В:
О:

Нет…

В контроллере представления InstaTwit содержатся массивы
feelings и activities. Мы выбрали такое решение сознательно, чтобы
код первого проекта был покороче, но в более масштабном проекте
это создало бы проблемы. В наших последующих проектах данные
будут выделяться в модель. Помните — мы вас предупредили.

основные паттерны iOS

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

Марко нужно мобильное приложение для
социальных сетей.
К счастью, в iOS работать с Twitter и Facebook
несложно. Считается, что любой ресторан должен иметь свой сайт и присутствовать в социальных сетях. Не секрет, что у шеф-повара дел по
горло, и ему некогда возиться с компьютером.
Посмотрим, что же Марко хочет от своего приложения.

Марко, шеф-повар
и владелец ресторана.
С техникой не в ладах.

но:
не нуж
Что м
отстая
1. Про
тов.
а тви
правк
бновтое о
с
о
р
П
2.
страмоей
ление
book.
в Face
ницы
витах
сех т
в
о
В
3.
сутн при
долже
ег
ать т
ствов
cos.
#mar

дальше 

63

возьми в руку карандаш

Возьми в руку карандаш
Вы в общих чертах представляете, как должно работать приложение. Мы
ограничимся одним представлением; оно должно обновлять свое состояние и поддерживать публикации в Twitter и Facebook. Сделайте набросок,
как оно, по-вашему, должно выглядеть.

ая
ажн ки
в
ь
ен абот врер
о оч
Эт ь раз лейте ние
т
а
с
ж
рое ов
ча
з
ост
. Не
iOS и на п и эски он
т
в
е
о
о
к
к
м
есь
рос
ий,
наб ложен ирает гда
б
е
и
пр вы со од вс рую
рые ать. К о вто
в
созд ется
ш
и
.
п
ь
ред
оче

64

глава 2

основные паттерны iOS

Íà÷èíàåì ñ Xcode è Git
Сейчас вы становитесь на путь профессиональной разработки iOS, поэтому новый
проект будет создаваться с включенной поддержкой Git. Сначала мы создадим
пустой проект, а затем разберемся с дизайном приложения.

1

Создайте новый проект в Xcode.
При запуске Xcode открывается заставка; найдите команду
«Create a new Xcode project» (слева в центре). Если среда Xcode
уже запущена, выберите команду File→New→Project...

2

Выберите вариант Single View Application.
Щелкните на кнопке Next.

3

Задайте параметры нового проекта.
Введите имя приложения «MarcoPollo»; оставьте префикс класса (Class Prefix)
по умолчанию. Выберите целевое устройство iPhone и щелкните на кнопке Next.

4

Выберите каталог
для сохранения
приложения.
Проследите
за тем, чтобы
флажок Source
Control был
установлен,
а справа был
выбран вариант
«Create git repository
on My Mac».
Нажмите кнопку
Create.

дальше 

65

решение упражнения

Возьми в руку карандаш
Решение

Вот какой дизайн приложения Марко получился у нас. В нем
предусмотрено место для ввода информации состояния
и средства публикации этой информации.

MarcoNetwork

и Марко
В этой област ои
св
ь
ит
од
будет вв
.
ия
ен
щ
сооб

Go!

правки
Кнопка для от book
ce
Fa
в
ий
сообщен
.
er
itt
Tw
и

а. Так как
Это клавиатур назначено
ед
приложение пр
сообщений,
для отправки
а все время.
она будет видн

часто

Задаваемые
вопросы

В:

А у меня получился другой дизайн.
Это нормально?

О:

Конечно! Существует много подходов
к проектированию приложений. Если вы
обратитесь к похожим приложениям в App
Store (Hootsuite, Seezmic, даже Facebook),
вы найдете в них похожий дизайн. Полезно
познакомиться с приложениями, решающими аналогичные задачи, чтобы получить
предоставление об удачных дизайнерских
решениях.

66

глава 2

В:

Работу над приложением следует
начинать с проработки дизайна?

О:

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

В:

Стоит ли ограничить длину текста
в текстовом поле?

О:

Да! Длина сообщений Twitter ограничивается 140 символами. Соответствующую
проверку мы добавим позднее, но отметить
этот момент на стадии дизайна определенно
стоит.

основные паттерны iOS

Ïåðåõîäèì ê ïîñòðîåíèþ èíòåðôåéñà!
Пора браться за Xcode и переходить к построению этогопредставления. В Xcode есть удобный редактор для построения графических интерфейсов (GUI); чтобы отредактировать
представление, достаточно щелкнуть на файле Main.storyboard.

Один момент! У меня Xcode
выглядит совсем не так. В чем дело?

У Xcode широкие возможности
настройки конфигурации.
Чтобы вывести на боковую панель другие
библиотеки, пощелкайте на кнопках в правом верхнем углу представления. На нижней
панели отображается консольный вывод
и другие сообщения.
Используйте эти кнопки для настройки содержимого боковой панели. Переверните
страницу, там настройка рассматривается
более подробно.
дальше 

67

изменение рабочей среды

Упражнение!

68

Чтобы отредактировать представления в Xcode, следует открыть
файл .storyboard и изменить некоторые настройки рабочего пространства.

1

Выделите файл Main.storyboard.

2

Вызовите содержимое библиотеки,
открыв панель Utilities.

3

Библиотека объектов (Objects
Library) для представлений
открывается этой кнопкой.

4

Размер панели библиотеки регулируется
перетаскиванием этой полосы.

глава 2

основные паттерны iOS

Ïåðåõîäèì ê ïîñòðîåíèþ èíòåðôåéñà... äóáëü äâà
Раскадровки (storyboards) появились в iOS 5; эта технология упрощает
редактирование пользовательского интерфейса. Интерфейс на базе
перетаскивания заметно ускоряет построение макета, но в раскадровках
представлены и переходы между представлениями в более сложных приложениях, включающих более одного представления. Мы уже знаем, как
должно выглядеть наше приложение, поэтому работа над ним сводится к
перетаскиванию и размещению нужных компонентов в нужных местах.

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

ения нам
редставл
п
го
о
эт
, кнопка
Для
ся надпись
понадобят е поле для ввода
во
и тексто бщения.
о
текста со

в списке
Найдите
екВ этой о
ощают
бласти бу
utton), т w)
(B
Эти тонкие синие линии упр
у
к
п
о
н
к
д
м
в
ет
ало
ещ
tV
ерв
инт
разаться кла
(Tex ie
выравнивание и настройку
виатура.
овое поле el) и пест
е
о
оры
т
от
о
нек
е
бр
З
дне
а
Поз
а
жен
(Lab
между элементами.
и надпись их в предотвечает ие клавиатуры
рассмоут
буд
ей
ост
ожн
е
возм
т
х
iOS, так
из эти
ретащи
вас потр
да нужно
ебуется т что от
е.
и
ен
трены более подробно; а ког
ставл
выделить
ол
iPhone 5
место по ько
будет обеспечить поддержку
д
ин
нос
ее
от
мся
.
зуе
оль
и iPhone 4, мы восп
тельным распределением.

За дело!

дальше 

69

построение раскадровки

Ïîñòðîåíèå ðàñêàäðîâêè
Сейчас мы займемся добавлением и настройкой всех компонентов представления. Начнем с надписи (UILabel) в верхней части представления.

Захватите надпись и перетащите ее в левый верхний угол представления. Во время перетаскивания под контроллером представления появляются ограничения. Они выбираются на основании
рекомендаций Human Interface Guidelines (HIG) компании Apple;
как правило, вам стоит соблюдать эти рекомендации и оставить
предлагаемое пространство.

оОба ограничения должны от
ре
бражаться, если в инспекто
».
ard
and
«st
жок
фла
н
установле

Измените текст надписи и исправьте высоту. Все эти операции можно выполнить
на панели инспектора атрибутов (Attributes Inspector) в правой части редактора.

В инспекторе введите новый
текст надписи MarcoNetwork.

Выберите панель Size
на панели инспектора
атрибутов...

И введите новую высоту 60.

70

глава 2

основные паттерны iOS

Ïîñòðîåíèå ðàñêàäðîâêè (ïðîäîëæåíèå)
Аналогичные изменения необходимо внести в конфигурацию двух
других элементов представления, UITextView и UIButton.

Убедитесь
в том, что
здесь задана
высота 180.

Наконец, добавьте в нижней части представления кнопку, соблюдая предложенное по умолчанию расстояние от краев.

дальше 

71

тест-драйв

Тест-драйв
1

Это ваша раскадровка в Xcode.
В данный момент представление должно содержать три элемента: надпись в
верхней части экрана, текстовое поле
для сообщения и кнопку для выполнения
операции.
Мы воспользовались Interface Builder для
настройки макета и изменения высоты
некоторых элементов, чтобы привести
представление к нужному виду.

2

72

Щелкните на кнопке запуска.
Посмотрите, что получилось!
Внешний вид приложения соответствует описанию из файла .storyboard.

глава 2

основные паттерны iOS

Что это за латынь какая-то? Итальянский —
я еще понимаю, но латынь? С этим нужно
что-то делать. И ведь на кнопке не должно
быть написано «кнопка», верно? Да и
заголовок мог бы быть посимпатичнее...

Стандартные элементы управления такие...
стандартные.
В изначальном состоянии готовые элементы управления не впечатляют. Впрочем, вы их можете настроить.
Многие элементы управления поддерживают нестандартную графику, так что используйте в своем приложении
цветовые темы, стили оформления кнопок и т. д. Будьте
осторожны при настройке элементов; помните, что главное — юзабилити. И даже если вы думаете, что мигающая
ядовито-зеленая кнопка выглядит стильно, пользователи
могут с вами не согласиться.

напряги мозги
Запишите список дел для выполнения требований Марко.
Сверьтесь со списком в нижней части страницы.

1. Изменить шрифт заголовка. 2. Убрать текст на латыни и заменить его текстом по умолчанию «». 3. Заменить текст кнопки строкой «Post it!»
дальше 

73

редактирование раскадровки

Xcode ïîçâîëÿåò ëåãêî âíîñèòü êîñìåòè÷åñêèå èçìåíåíèÿ
Мы уже пару раз вносили изменения в инспекторе, но давайте разберемся подробнее. Начнем с исправления текста по умолчанию и надписей.
ектор
Используя инсп рите для
бе
вы
,
ов
атрибут
Network
надписи Marco
o 17.0.
fin
pi
Za
шрифт

Упражнение!

А текст выровняйте
по центру — так он
лучше смотрится.

Выделите кнопку и при помощи инспектора атрибутов измените
текст кнопки на «Post it!»
Затем выделите текстовое поле, в инспекторе атрибутов удалите
большой блок текста на латыни и введите вместо него строку
«».

 ïðèíöèïå òî æå ñàìîå ìîæíî áûëî ñäåëàòü â ïðîãðàììíîì êîäå...
При внесении подобных изменений (размер шрифта, текст по умолчанию и т. д.) в Interface
Builder среда Xcode записывает эту информацию в раскадровку, чтобы она задавалась при
загрузке раскадровки приложением. Все, что здесь делается (а также многое другое), также
можно сделать в коде приложения. Выбор между изменением пользовательского интерфейса
в программном коде или в Interface Builder отчасти является делом вкуса — и конечно, зависит
от того, предоставляет ли Interface Builder средства для внесения таких изменений.

74

глава 2

основные паттерны iOS

Ýëåìåíò óïðàâëåíèÿ iOS èçíóòðè
Мы изменили текст на кнопке, но когда пользователь прикасается к кнопке, по-прежнему ничего не
происходит. Чтобы кнопка делала что-то осмысленное, необходимо связать ее с программным кодом.
#import “ViewController.h”
@interface ViewController ()
Пользователь прикасается
к экрану

@end
@implementation ViewController
Написанный нами
код Objective-C
- (void)viewDidLoad
{
ViewController.m

[super viewDidLoad];

// Do any additional setup after
loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning

Êîä êíîïêè âûçûâàåò äåéñòâèå
Если вернуться к паттерну «Модель-Представление-Контроллер» — пока все наши действия
относились к представлению. Пора заняться
поведением, то есть перейти к функциональности контроллера.
Чтобы связать поведение с действиями пользователя, Objective-C связывает события с методами
действий IBAction (IB в имени IBAction — сокращение от Interface Builder). У каждого элемента
управления имеется одно или несколько событий, которые инициируются при выполнении
каких-либо действий (например, прикосновения
пользователя). Событие элемента управления
можно связать с блоком кода, помеченным как
IBAction, в Interface Builder (это можно сделать
и на программном уровне). Когда действие пользователя приводит к срабатыванию события,
iOS вызывает метод действия и передает ему
информацию о том, что произошло.

{
[super didReceiveMemoryWarning];
//
Dispose of any resources that can be
recreated.
ated.
}

Представление

@end
ь
Модел

Сейчас мы
находимся
здесь
Конт

ролл

ер

дальше 

75

assistant editor

Для любознательных
В Xcode имеется режим Assistant Editor, в котором могут отображаться обе части класса одновременно (.h и .m) или представление вместе с ассоциированным контроллером представления. В этом
режиме также можно графически связывать события с IBAction. Для активизации этого режима редактирования следует закрыть правую панель в редакторе и включить режим Assistant Editor.

Закройте
правую
панель.

Откройте
Assistant Edito
r.

Мы хотим
установить
связь между раскадровкой и классом
ViewController,
на базе которого она создается.
При открытии
файла .storyboard
на правой панели должен быть
выбран файл
ViewController.h.

После того как вы выберете нужный файл и откроете Assistant Editor,
здесь появляются файлы
раскадровки, а справа —
файл ViewController.h.

Assistant Editor не всегда показывает то, что нужно.

Будьте
осторожны!
76

глава 2

Если на правой панели отображается файл .m, щелкните на
стрелках в правом верхнем углу, чтобы вызвать на экран файл
ViewController.h.

основные паттерны iOS

Äåéñòâèÿ ñîçäàþòñÿ â ðåäàêòîðå ãðàôè÷åñêîãî èíòåðôåéñà ñðåäû Xcode
Редактор графического интерфейса (GUI) среды Xcode позволяет визуально настроить действие
для любого компонента (в нашем случае это кнопка «Post it!»).
1

Выделите кнопку «Post it!» в раскадровке.

2

Щелкните с нажатой клавишей Ctrl (или используйте правую кнопку
мыши) и перетащите указатель на файл ViewController.h на правой панели,
между директивами @interface и @end в этом файле.

Xcode рисует линию, показывающую, в какую точку
проводится связь.

3

Настройте связь как действие (Action) с именем «postItButtonPressed».
Сохраните созданную связь кнопкой Connect.

дальше 

77

тест-драйв

4

Xcode добавляет в заголовочный файл объявление действия, а в файле реализации создается пустая реализация. Просто чтобы убедиться в том, что все
прошло правильно, включим в реализацию .m команду вывода сообщения.
Программный код выглядит так:

- (void)didReceiveMemoryWarning
{

Найдите метод действия (IBAction),
сгенерированный
в файле .m.

[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)postItButtonPressed:(id)sender {

NSLog(@”Post It button was pressed!”);

Поместите код
вывода сообщения в фигурные
скобки.

}
@end

ViewController.m

тест-драйв
Одну минуту... Я понятия не имею,
что здесь происходит. Да, мы
создали действие... А дальше-то что?

78

глава 2

основные паттерны iOS

Ñâÿçûâàíèå ýëåìåíòîâ óïðàâëåíèÿ ñ äåéñòâèÿìè
Ýòî âàø ýëåìåíò óïðàâëåíèÿ

Ýòî âàø êîíòðîëëåð...

Класс
контроллера
представления

Элемент управления представляет визуальный
компонент, содержащий информацию о шрифте,
цвете текста, графике нажатого и ненажатого
состояния, цветах фона и т. д. Он отвечает за отображение информации и ввод данных. Элементы
управления могут использоваться в разных местах,
поэтому неразумно включать в них код, привязанный к конкретному приложению. Элементы
управления просто инициируют события, сообщая
окружающим: «Эй! Тут у меня кое-что произошло...»

Логика приложения реализуется в коде, который вы пишете для своих приложений. Она
принципиально отделяется от визуальных
аспектов — того, что видит пользователь. Программисту не нужно писать код перерисовки
кнопок в каждом приложении, которое он
создает. Он работает над поведением — тем,
что должно делать приложение «на высоком
уровне» (например, отправлять сообщения
для Марко).

Ó ýëåìåíòà óïðàâëåíèÿ åñòü ñîáûòèÿ...
При настройке связи в диалоговом окне Xcode было выбрано
событие по умолчанию. Если вернуться к диалоговому окну и
щелкнуть на кнопке со стрелкой, вы увидите список событий,
которые могут инициироваться приложением.

выводятся
Все варианты
го собыво
но
я
дл
только
которое
о,
тия (а не тог
ено).
ро
ст
на
ло
уже бы

дальше 

79

события и действия

...è ýòè ñîáûòèÿ ìîæíî ñâÿçûâàòü ñ äåéñòâèÿìè
Разные элементы управления могут инициировать разные события,
но в общем случае событие сообщает системе о том, что пользователь что-то сделал. Например, мы связали событие «Touch Up Inside»
с нашим действием, чтобы узнать, когда пользователь отведет палец
от экрана внутри кнопки. Обычно в приложениях не задействуется
только событие Touch Up Inside.
При связывании события с действием iOS передает информацию
о том, какой элемент управления отправил событие; это означает,
что при желании одно и то же действие может использоваться для
обработки разных событий от разных элементов управления (нужно
лишь определить, кто именно отправил событие). С другой стороны,
код усложняется по сравнению с решениями, использующими разные
методы действий, поэтому чаще в программах создается отдельное
действие для каждого события, на которое должна реагировать
программа.

ты
элемен
Разные ия поден
управл
зные
ают ра
держив , полный
я
событи риведен
п
список нтации
е
м
у
к
о
вд
Apple.
UIKit от

Устанавливая связи
событий с действиями,
вы связываете
операции, выполняемые
пользователем, с кодом
приложения.

Класс
контроллера
представления

Дело сдвинулось! У нас есть элемент
управления, событие и действие. Но нам
предстоит еще многое сделать...

80

глава 2

1

Получить текст, который ввел Марко.

2

Добавить в него рекламную часть.

3

Опубликовать сообщение Марко.

4

Получить бесплатный обед!

основные паттерны iOS

кие-то
если ка ! Через
,
ь
с
е
т
ны
чай
Не огор
непонят
аете,
ны вам ниц вы все узн ажи
м
р
е
р
т
а
ить уп
ко стр
несколь буйте выполн
о
но попр час!
ей
нение с

Кто и что делает?
ае
ае
Соедините каждый компонент разработки для iOS с его описанием.

Компонент
Элемент управления

IBAction

IBOutlet

Описание
Визуальный элемент, который может реагировать на операции пользователя и инициировать события для любой стороны, которая пожелает эти события обрабатывать.
Объект, предоставляющий логику работы
представлений iOS. Как правило, содержит
ссылки на элементы представления, код реакции на операции пользователя, а также
логику перехода на другие представления.
Событие, которое инициируется кнопкой
для обозначения того, что пользователь
оторвал палец от экрана внутри области
кнопки, а проще говоря, нажал кнопку.

Контроллер представления

Индикатор свойства класса, который сообщает Interface Builder, что это свойство связывается с элементом пользовательского
интерфейса.

Touch Up Inside

Код (Objective-C), вызываемый при инициировании соответствующего события.

дальше 

81

не бывает глупых вопросов

часто

Задаваемые
вопросы

В:

Мне встретился термин «файлы nib».
Что это такое?

О:

До появления файлов раскадровки
.storyboard использовались файлы nib, которые в действительности имели расширение
.xib. Теперь эти файлы описывают одно
отдельное представление в составе файлов .storyboard. При желании вы можете
работать и с файлами nib, но в контексте
книги лучше придерживаться практики, рекомендованной Apple.

В:

Что собой представляют файлы
.storyboard?

О:

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

82

глава 2

В:

Это уже второе наше приложение
для iPhone, как насчет других устройств?

О:

И до них дойдет! Пока мы стараемся
не усложнять материал. Кроме того, это
отличная возможность задуматься об удобстве использования. Существует немало
приложений, для которых имеет смысл
только реализация на iPhone. Приложения
для бегунов, приложения для путешественников — словом, любые приложения,
которые вряд ли кому-нибудь захочется
использовать на iPad.

В:

А если я захочу добавить поддержку
iPad позднее?

О:

Хороший вопрос. Это можно сделать
двумя основными способами. Прежде всего,
можно построить универсальное приложение вместо приложения, предназначенного
только для iPhone. Кроме того, в наших
представлениях учитывается еще одно обстоятельство: вместо фиксированных расстояний в дизайне наших представлений мы
определяем интервальные распределения.
Разработка для iOS имеет много общего
с веб-программированием и даже (о ужас!)
программированием для Android. С выходом

iPad mini и различных экранов Retina приходится поддерживать много разных размеров
устройств, причем в будущем этот набор
будет только расширяться. Один из способов сохранить жизнеспособность вашего
приложения — строить представления на
основе интервалов вместо фиксированных
позиций компонентов.

В:

Мне не нравятся редакторы GUI,
я предпочитаю работать в командной
строке. Что делать?

О:

Это тоже возможно. Впрочем, мы бы не
рекомендовали этот путь. Компания Apple
потратила много времени и сил на то, чтобы
усовершенствовать свой редактор GUI и
сделать его удобным для разработчиков.
Попробуйте поработать с ним — хотя бы
недолго!

В:

Вы начали говорить о действиях. Но ведь пока о синтаксисе
ничего толком не сказано...

О:

Вскоре мы доберемся и до синтаксиса,
честное слово! Просто продолжайте читать...

основные паттерны iOS

Кто и что делает?
ае
ае
решение
Соедините каждый компонент разработки для iOS с его описанием.

Компонент
Элемент управления
Кнопка, текстовое
поле и т. д.

IBAction

IBOutlet
Вскоре мы рассмотрим ссылки IBOutlet более
подробно.

Контроллер представления

Описание
Визуальный элемент, который может реагировать на операции пользователя и инициировать события для любой стороны, которая
пожелает эти события обрабатывать.
Объект, предоставляющий логику работы
представлений iOS. Как правило, содержит
ссылки на элементы представления, код реакции на операции пользователя, а также логику перехода на другие представления.
Событие, которое инициируется кнопкой
для обозначения того, что пользователь оторвал палец от экрана внутри области кнопки,
а проще говоря, нажал кнопку.
Индикатор свойства класса, который сообщает Interface Builder, что это свойство связывается с элементом пользовательского интерфейса.

Touch Up Inside
Код (Objective-C), вызываемый при инициировании соответствующего события.

Èòàê, î êëàññàõ è èíòåðôåéñàõ...
Мы снова и снова упоминаем контроллеры представлений и пользовательские интерфейсы,
но так толком и не объяснили, как же работают классы и интерфейсы. Мы добавили в интерфейс
контроллера представления метод (IBAction)... и все. Давайте выделим пару минут и познакомимся с классами поближе. В конце концов, всю оставшуюся часть книги мы будем заниматься
написанием классов, так что лучше заранее понять, с чем же мы будем иметь дело...
дальше 

83

классы Objective-C

Классы... под увеличительным стеклом

Objective-C: классы на каждом шагу
Все, что только
есть в приложении
как
iOS, определяется
пи
на
в
о

класс где
санном вами коде.

#import “ViewController.h”
@interface ViewController ()
Вы создаете
@end
в Xcode
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Дополнительная
настройка после загрузки
представления, обычно из nib.
}

foo.h

- (void)didReceiveMemoryWarning
foo.m
{

t

[super
didReceiveMemoryWarning];
// Уничтожение всех ресурсов,
которые могут быть созданы
заново.
}
@end

Интерфейс — то, что делает ваш
класс.
яет, что
Интерфейс объявл
ш класс
ва
ь
ат
ел
сд
т
може
льзопо
ис
ен
и как он долж
ктами.
ъе
об
и
им
уг
др
ся
вать

Реализация — то, как
ваш класс это делает.

класс
исывает, как ваш
Файл реализации оп лжен делать в соотдо
делает то, что он
Другие
ным интерфейсом.
ана
ветствии с заявлен
ов
из
суются, как реал
и
объекты не интере
он

е
но
ав
ность, гл
та или иная возмож
те это сделать!
же
мо
вы
о
чт
т,
знаю

Написанный код делится на классы. Класс имеет интерфейс и реализацию.
84

глава 2

основные паттерны iOS

Стоп, я уже имел дело с интерфейсами.
Это как в Java, верно? Класс реализует
интерфейс.

Не совсем...
В Objective-C файл .h просто объявляет открытый
(общедоступный) интерфейс класса, включая
все свойства, методы, и возможно — приватные
переменные (хотя обычно они перемещаются в
файл .m и не входят в открытый интерфейс. Интерфейсы Java часто сравнивают с протоколами
Objective-C, о которых мы поговорим позже.

Objective-C

Интерфейс
Java

=

Реализация
Java

дальше 

85

часто задаваемые вопросы

часто

Задаваемые
вопросы

В:

А во всех этих событиях трудно
разобраться?

О:

Существует множество событий, на
которые iOS реагирует для разных элементов управления; и кнопка является одним из
самых простых случаев. Слова в текстовом
описании события тщательно выбираются.
Например, «Touch up inside» («Отпускание
пальца внутри») используется потому, что
iOS должна реагировать на окончание прикосновения к кнопке, а не на его начало.
За дополнительной информацией о событиях и описаниями обращайтесь к руководству «Event Handling Guide» в документации
разработчика iOS.

В:
О:

Но я вижу ошибки компиляции?

Бывает. Xcode обычно выдает полезные предупреждения перед запуском приложения. Индикаторы обычно выводятся
в верхней части окна. Если вы видите маленькие красные восклицательные знаки
или желтые треугольники, значит, что-то
пошло не так.

86

глава 2

Вы можете щелкнуть на них, чтобы перейти
прямо к проблемному коду. А оказавшись
на нужном месте, вы узнаете, что же не
нравится Xcode.

В:

Как скрыть или вызвать на экран
отладчик?

О:

Если приложение останавливается во
время выполнения в эмуляторе, происходит
возврат прямо в Xcode в представлении
отладчика.
Чтобы вернуться к нормальному представлению с файлами, щелкните здесь:

В:
О:

Что это за @ в начале строк?

Не забывайте, что Objective-C является
объектно-ориентированным языком. Обычно для работы со строками в Objective-C
используется класс NSString, но из-за частого использования строк в Objective-C
поддерживается сокращенное обозначение
инициализации объектов NSString: знак ‘@’.

основные паттерны iOS

Все это замечательно... но как
поживает мое приложение?
Я хочу, чтобы в мой ресторан
приходили клиенты!

дальше 

87

использование свойств

È êàê äîáðàòüñÿ äî òåêñòà?
Итак, у нас имеется действие, вызываемое при нажатии кнопки. Теперь нужно как-то
получить доступ к тексту сообщения, чтобы опубликовать его в Twitter!

?

Действие
Пользователь
нажимает кн
опку

Кнопка иниции
действие.

Введенным текстом
распоряжается текстовое
поле, и его желательно хранить в
переменной, так? Тогда действие
сможет просто обратиться к
текстовому представлению и
запросить у него текущий текст!

Правильно! В Objective-C для обращения
к переменным используются свойства.
В отличие от других языков, в которых методы
доступа приходится создавать явно, свойства
Objective-C поручают всю «черную работу»
компилятору. Вам остается лишь определить
свойство в файле .h.

88

глава 2

рует

И выполняется...

основные паттерны iOS

Ìåòîäû ÷òåíèÿ è çàïèñè ñâîéñòâ ñîçäàþòñÿ àâòîìàòè÷åñêè
Директива @property в заголовочном файле сообщает компилятору об определении
свойства. В современном языке Objective-C методы доступа свойств синтезируются
автоматически — включать директиву @synthesize в файл реализации не обязательно.
В синтезированных свойствах компилятор генерирует метод чтения, а для свойств с
возможностью чтения/записи — метод записи и реализует их на основании атрибутов
@property, объявленных в файле .h.

ное
Синтезирован
дере
оп
во
свойст
ые
ляет открыт
ия
ен
чт
ы
метод
и записи. Эти
е
методы такж
выполняют за
дивас все необхо
мое управление
памятью!

В этой части
весь код создается компилятором при
определении и
синтезировании
свойства.

Метод чтения
iVar
Метод записи
Переменные экземпляров в Objective-C
объявляются закрытыми (приватными) в реализации
класса.

Как же все
это выглядит
в Objective-C?
дальше 

89

возьми в руку карандаш

Возьми в руку карандаш
Из приведенных ниже фрагментов кода только один сохраняет текстовое поле для публикации сообщения. Обведите этот
фрагмент кружком!

NSLog(@”Post It button
was pressed: %@”, self.tweetTextView.text);

@property (weak, nonatomic) IBOutlet UITextView *tweetTextView;

self.tweetTextView.
font=[UIFont fontWithName:@”Helvetica” size:15.f];

NSString *buttonTitle=[sender titleForState:UIControlStateNormal];

90

глава 2

основные паттерны iOS

Ñîçäàéòå ñâîéñòâî äëÿ òåêñòîâîãî ïîëÿ
Нам понадобится свойство для упаковки всего, что относится к текстовому полю
с сообщением, а также механизм получения информации. В редакторе раскадровки
Storyboard Editor мы снова создадим все необходимое для подготовки текста и использования его в приложении.

Упражнение!

Выделите текст, нажмите клавишу Control и перетащите
указатель мыши между директивами @interface и @end
в файле ViewController.h.

Созданный код содержит
свойство, которое делает
все необходимое за нас!

язь типа
Мы создаем св
е в поле
Outlet. Введит
tTextView
ee
tw
я
Name им

РАССЛАБЬТЕ

СЬ

Синтаксис свойств будет более подробно
описан ниже.

дальше 

91

решение упражнения

Возьми в руку карандаш
Решение

Мы предложили несколько вариантов для выбора фрагмента кода,
используемого для сообщения. А какой вариант выбрали вы?

Использует т
ек
вое поле для вы стовода
сообщения на
консоль.
NSLog(@”Post It button
was pressed: %@”, self.tweetTextView.text);

А вот и нужный код. Мы
создаем свойство IBOutlet
и связываем его с текстовым
полем в раскадровке.

@property (weak, nonatomic) IBOutlet UITextView *tweetTextView;

self.tweetTextView.
font=[UIFont fontWithName:@”Helvetica” size:15.f];

фт
Изменяет шри
ля
по
о
ог
ов
ст
ек
т
.
м
ие
ен
с сообщ

NSString *buttonTitle=[sender titleForState:UIControlStateNormal];

Отправителем (‘sender’) в
данном случае
является кнопка с текстом
«Post it».
Этот код просто получает
текст кнопки
в нормальном состоянии.

92

глава 2

основные паттерны iOS

Ýëåìåíòû óïðàâëåíèÿ ñâÿçûâàþòñÿ ñî ññûëêàìè IBOutlet
Создание ссылки IBOutlet было последним шагом, необходимы для взаимодействия с текстовым полем. Так как в текстовом поле хранится текст сообщения, нам
нужен какой-то способ для обращения к нему из программного кода. В данном
случае мы работаем с элементом управления из пользовательского интерфейса,
а не просто реагируем на событие.
ворит:
Эта ссылка го
компонент
на
«Я указываю
огу обраUITextView и м
по имени
у
м
не
щаться к
».
tweetTextView

@property (weak, nonatomic)
IBOutlet UITextView *tweetTextView;

ViewController .h
и ViewController.m

- (IBAction)
postItButtonPressed

ите
Нажм !
у
к
кноп

 Twitter!

Ññûëêà IBOutlet îòíîñèòñÿ ê êîìïîíåíòó ïîëüçîâàòåëüñêîãî èíòåðôåéñà
Так как пользователь взаимодействует с интерфейсом, нам необходим способ обращения к этому интерфейсу и его обновления в программном коде. Для отправки
сообщений нужно реагировать на нажатия кнопок (IBAction) и получить доступ
к тексту, введенному пользователем (IBOutlet).

дальше 

93

тест-драйв

Тест-драйв

-

1

Создайте связь со ссылкой IBOutlet.
Если это не было сделано ранее, вернитесь назад и перетащите в раскадровке указатель мыши с нажатой клавишей Ctrl в файл ViewController.h.

2

Выведите сообщение на консоль.
После создания ссылки IBOutlet все готово — нужно только как-то
проверить, что ссылка работает. Отредактируйте сообщение NSLog
в методе postItButtonPressed в файле ViewController.m.

(IBAction)postItButtonPressed:(id)sender {
NSLog(@”Post It button was pressed: %@”, self.tweetTextView.

text);
}

ViewController.m

3

94

глава 2

Запустите приложение в эмуляторе.
Постройте и запустите приложение. Когда оно заработает, введите на месте текста что-то более содержательное
и нажмите кнопку «Post It»...

основные паттерны iOS

часто

В:
О:

Задаваемые
вопросы
Напомните, что такое событие?

Элементы управления генерируют события, когда с ними что-то происходит. Вы
можете связать эти события с методами,
чтобы при возникновении события вызывался соответствующий метод. Как правило,
события связываются с методами в Interface
Builder, но также можно создавать такие
связи в программном коде (мы займемся
этим позднее).

В:

Выходит, одна строка автоматически сгенерированного кода решает сразу
несколько задач?

О:

Да! При создании ссылки IBOutlet (перетаскиванием указателя мыши с нажатой
клавишей Ctrl) генерируется строка кода,
начинающаяся с @property. Она объявляет переменную, создает методы чтения
и записи этой переменной, а также создает
ссылку для получения текста из текстового
поля. И все это в одной крошечной строке!

В:

Вроде раньше нужно было использовать директиву @synthesize?

О:

Да, но это было раньше. С реализацией
ARC (автоматического подсчета ссылок)
компания Apple переместила большую
часть операций управления памятью при

разработке для iOS из кода в компилятор.
Директива @synthesize использовалась
для создания переменной в файле реализации и запуска процесса. Теперь компилятор
делает это все за вас.

В:

Объявление @property всегда
генерирует методы чтения и записи?

О:

Не всегда! Свойство может быть доступным для чтения/записи или только для
чтения. Когда свойство определяется как
доступное только для чтения, компилятор
генерирует только метод чтения. Такое
определение гарантирует, что свойство
не может быть изменено методом записи.

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Действия реагируют на события.



Ссылки IBOutlet предназначены для
работы с компонентами пользовательского интерфейса; они используются для отображения или получения информации от пользователя.



кода, необходимого для создания
действий и ссылок IBOutlet.


Объявления свойств создают переменные экземпляров, а также
методы чтения и записи для этих
переменных.

Редактор раскадровки способен автоматически создать большую часть

дальше 

95

twitter — готовое блюдо

Ïðîñòàÿ ðàáîòà ñ Twitter
В iOS 6 впервые появились инфраструктуры для работы с Twitter
и Facebook. Вместо того чтобы заставлять разработчиков разбираться
с API и механизмами аутентификации на этих сайтах, Apple делает все
за вас — и это замечательно, потому что технические подробности время
от времени изменяются.

ельно
ствит те знакой
е
д
о
роси
И эт
прио — сп
прост работчиков ово
з
к
а
а
к
р
oid,
мых
й Andr ...
и
н
е
ж
о
м
л
ится и
приход

В вашем проекте должна быть установлена инфраструктура для
отправки сообщений (инфраструктуры — аналоги библиотек
в Java).
В приложение должен быть включен код отправки сообщения.

Готово
к употреблению
Выделите проект, убедитесь в том, что выбрана вкладка General, после
чего прокрутите список до раздела Linked Frameworks and Libraries и
нажмите кнопку +. Выберите в списке строку Social Framework и нажмите кнопку Add.

Здесь выделяется
проект.

встана
Здесь у я новая
с
ливает труктура.
с
а
р
ф
ин

96

глава 2

основные паттерны iOS

Готово
к употреблению
Ниже приведен код, который необходимо добавить в программу,
чтобы заработала поддержка Twitter. Всего несколько строк, и ваше
приложение начинает отправлять сообщения в Twitter!

#import “ViewController.h”
#import “Social/Social.h”

- (IBAction)postItButtonPressed:(id)sender {
NSLog(@”Post It button was pressed: %@”, self.tweetTextView.text);

SLComposeViewController *composer = [SLComposeViewController compose
ViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:self.tweetTextView.text];
[self presentViewController:composer animated:YES completion:nil];
}


компоновщик
Здесь вводится представление,
ое
новое модальн
ки
автоматичес
которое будет стом сообщения
ек
заполняться т
Марко.

ViewController.m

Проверим...
дальше 

97

тест-драйв

Тест-драйв

98

1

Проследите за тем, чтобы в проект была включена
инфраструктура Social framework и приведенный
выше код.

2

Постройте и запустите приложение.
Введите новое сообщение.

3

Настройте учетную запись Twitter в эмуляторе.
При нажатии кнопки «Post it!» вам будет предложено
выполнить настройку учетной записи. А когда это будет
сделано, публикация сообщений в Twitter заработает!

глава 2

основные паттерны iOS

Отличная работа!
У дверей ресторана Марко
уже собирается очередь...

часто

Задаваемые
вопросы

В:
О:

Чем метод с объявлением IBAction отличается от остальных методов?

Ничем! Методы IBAction ничем не отличаются от любых других методов в файле реализации. Объявляя метод как ‘IBAction’,
вы сообщаете IB, что он может использоваться для подключения к событиям элементов управления.

дальше 

99

добавление хеш-тега

#MarcoPollo
А где мой хеш-тег? Как мне
узнать, что думают другие
люди?

Марко хочет организовать
дополнительную обработку сообщений
перед отправкой.
Цель Марко — эффективность и логичность.
Ну и возможно, хеш-тег #MarcoPollo пригодится для анализа и планирования. В приложение
нужно включить логику добавления хеш-тега...

100

глава 2

основные паттерны iOS

Магниты для iOS
Нужно включить в приложение код добавления хеш-тега
Марко. Так как текст должен добавляться при форматировании сообщения, мы снова возвращаемся к коду действия
postItButtonPressed...

- (IBAction)postItButtonPressed:(id)sender {
NSLog(@”Post It button was pressed: %@”, self.tweetTextView.text);
NSString

= [

stringWithFormat:@”

,

];
SLComposeViewController *composer = [SLComposeViewController compos
eViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:tweetText];
[self presentViewController:composer animated:YES completion:nil];
}

setIntitialText

NSString
animated

%@ #MarcoPo
llo

ew.
self.tweetTextVi
text

*tweetText

.text

дальше 

101

марко занят

Магниты для iOS. Решение
Нужно включить код добавления хеш-тега Марко и проверить,
не превышает ли длина сообщения 135 символов (для Twitter;
у Facebook ограничений нет).

- (IBAction)postItButtonPressed:(id)sender {
NSLog(@”Post It button was pressed: %@”, self.tweetTextView.text);
NSString

*tweetText

ew.text
self.tweetTextVi

= [ NSString

s
stringWithFormat:@” %@ #MarcoPollo

];

SLComposeViewController *composer = [SLComposeViewController compos
eViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:tweetText];
[self presentViewController:composer animated:YES completion:nil];
Не пропуст
ите
эту запят
ую!

}
екст, котопостроить т
общении.
Сначала нужно
со
в
я
ьс
льзоват
рый будет испо ем объект NSString для
ру
Мы инициализи
стом, ввеш-тега с тек
объединения хе телем.
ва
денным пользо

animated

.text
setIntitialTex
t

102

глава 2

,

основные паттерны iOS

Тест-драйв
1

Введите код из упражнения с магнитами.

2

Постройте и запустите приложение.
Продолжайте, добавьте еще один твит! И замечательную
подпись #MarcoPollo в конце.

3

Отведайте курицы!

Вот это да! Дела
уже пошли на лад!

дальше 

103

ГЛАВА 2

Âàø èíñòðóìåíòàðèé ðàçðàáîòêè äëÿ iOS
Глава 2 осталась позади, а ваш
инструментарий пополнился некоторыми
базовыми паттернами и синтаксическими
конструкциями.

а
Раскадровк

всех
ит описание
 Содерж
о приег
ш
ний ва
представле
ложения.
еделению
ота по опр
й
 Вся раб
едставлени
макетов пр
каас
р
е
едактор
ведется в р
.
or
it
d
E
d
boar
дровки Story
т возоддерживае
 Xcode п
ельт
си
отно
можность
ия при
ан
ов
р
ни
ного позицио
iOS
ен
прилож ий
разработке
.
ки
ов
др
ка
е рас
в редактор

Элементы упр
авления

 Предназнач
ены для взаим
одействия с пр
едставлением.
 Находятся
под управлением контроллер
ов, которые представ
ляют собой
классы.
 Эти классы
разделены на
файлы .h (загол
овок)
и .m (реализаци
я).

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Действия реагируют на события.



Ссылки IBOutlet используются для
работы с пользовательским интерфейсом для вывода или получения
информации от пользователя.



104

глава 2

Редактор раскадровки Storyboard
Editor автоматически генерирует

большую часть кода, необходимого
для создания действий и ссылок
IBOutlet.


Объявления свойств используются
для создания как переменных экземпляров, так и методов чтения
и записи этих переменных.

2.5 интермедия

Синтаксис
Понимаю, стенография и все
такое, но ведь ни единого слова
не разберешь...

Пора заняться мелочами. Мы написали пару приложений и более или
менее разобрались с общей картиной. Пришло время досконально, построчно разбираться в мелочах. Почему в коде повсюду разбросаны символы @?
Чем метод отличается от сообщения? Как именно работают свойства? Нас
ждет краткая экскурсия по синтаксису Objective-C; потом можно будет вернуться к построению приложений.

интерфейс и реализация

Êëàññû: èíòåðôåéñ è ðåàëèçàöèÿ
В Objective-C определение класса состоит из двух файлов, .h и .m. Файл .h
определяет, как другие объекты должны взаимодействовать с вашим классом.
Он определяет свойства, методы и другие атрибуты.
Файл .m, импортирующий файл .h, реализует внутреннее поведение класса.
Компилятор проверяет, что аспекты класса, определяемые в заголовочном
файле интерфейса, имеют реализацию в .m.

наЗдесь начи
яв
ъ
об
ется
ерление инт
сса... #import
фейса кла
Имя нового класса
@interface ViewController : UIViewController

Класс, произв
одным
от которого
является новый кл
асс

@property (weak, nonatomic) IBOutlet UITextView *tweetTextView;
- (IBAction)postItButtonPressed:(id)sender;
...а здесь
оно заканчивается.

В приложении Марко
здесь ничего
не используется,
поэтому
этот
фрагмент
шаблонного
кода остается пустым.

@end

свойства
Методы и
тся между
ю
га
распола
ace
ми @interf
директива
и @end.

ViewController.h
#import “ViewController.h”
#import “Social/Social.h”
@interface ViewController ()

ь расе добавит
Вы может сса для объявлеа
дет
ширение кл
которая бу как
,
ки
и
ог
о
ния л
ьк
ол
ться т
использова
ции.
ла реализа
й
а
ф
ь
част

@end
@implementation ViewController
...
@end

ещается
Здесь разм етодов.
м
я
и
ц
за
реали

ViewController.m

106

интермедия

Objective-C синтаксис

Çàãîëîâî÷íûå ôàéëû îïèñûâàþò èíòåðôåéñ êëàññà
В Objective-C при определении класса их интерфейс выделяется в заголовочный файл. Здесь
указывается, создается ли данный класс посредством наследования от других классов, а также
перечисляются переменные экземпляров, свойства и методы класса.
С развитием Objective-C часть кода стала перемещаться в файл реализации как расширение класса.
Это единственный способ определения действительно «закрытых» свойств и методов, ограниченных от постороннего доступа.

сы, переИнтерфей
земпляров
менные эк
явления
класса, объ ойства.
св
методов и
ViewController.h

@interface ViewController :
UIViewController
(weak, nonatomic)
@property (weak
IBOutlet UITextView *tweetTextView;

- (IBAction)postItButtonPressed:(id)sender;

Возьми в руку карандаш
Файл ViewController.h из приложения Марко. Заполните пустые
места и объясните, что делает каждая строка.

#import
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet
UITextView *tweetTextView;
- (IBAction)postItButtonPressed:(id)sender;
@end

ViewController.h

дальше 

107

решение упражнения

Возьми в руку карандаш
Решение

Перед вами текущая версия файла ViewController.h приложения.
Давайте посмотрим, как вы объяснили смысл каждой строки.

#import
директичти идентична
Эта строка по е C — не считая того,
ык
отвраве #include в яз
атически пред одного
ом
т
ав
е
что она
ни
че
атное вклю
ifndef
#
щает многокр
ки
ер
ов
пр
что
ми).
заголовка (так
ни
ш
ли
ановятся
MY_HEADER ст

чает,
@interface озна
емся
ра
что мы соби
с.
ас
кл
ь
т
объяви

Директива # import встраивает
другой файл (почти всегда заголовочный) в текущий файл во время
компиляции. Она используется для
включения классов, констант и т. д.
и других файлов.

Затем ук
а
класса, и зывается имя
если он на
следует от др
угого кла
сса —
двоеточи
е и имя су
перкласса.

@interface ViewController : UIViewController {
UITextField *notesField_;
Синтакси
с
отличает переменных экзем
пляров не
ся от C++
как int и
: базовые
flo
т
ний, а ука at) используются ипы (такие,
затели п
б
омечают ез изменеПо умолч
ся
ан
защищенн ию всем полям на звездочкой.
зн
ы
изменить й уровень доступа ачается
,
п
@и @publi ри помощи ключев но его можно
c, как и в
ых слов
C++.

Objective-C не поддерживает
...
множественное наследование

Здесь указывается, от какого
класса наследует текущий
класс и с какими протоколами он совместим.
Здесь объявляются переменные
экземпляров класса; в приложении Марко их не было, но
вы понимаете, что имеется
в виду.

}
После закрытия секции полей в интерфейсе следуют
объявления свойств. Директива @property сообщает
Objective-C о том, что для свойства следует сгенерировать методы доступа, для вызова которых будет использоваться «точечная» запись.

ViewController.h

108

интермедия

Objective-C синтаксис

Возьми в руку карандаш
Решение
ty сообство @proper
Ключевое свой ору о том, что для
т
щает компиля будет создан метод
ва
ст
ой
св
о
ог
эт
записи.
можно) метод
чтения и (воз
говорим
ойств; мы по
Атрибуты св
дробно...
о них более по

@property (weak, nonatomic) IBOutlet UITextView *tweetTextView;
IBOutlet
er по маркеру
Interface Build
мые
ства, связывае
в случае
опознает свой
ак

ия
управлен
с элементами tes в InstaTwit).
no
со свойством

о меозначает, чт
Знак«минус»
мпляра
зе
методом эк
тод является
ознаоб
с»
лю
«п
аком
оды
(тогда как зн
ет
м
е
класса). Вс
ыми.
чается метод
ыт
кр
от
ся
т
являю
в Objective-C

ства
мя свой
Тип и и огии с полями
л
(по ана
).
а
с
с
кла

Объявления методов.

- (IBAction)postItButtonPressed:(id)sender;
ьn испол
IBActio тки
р
е
к
р
а
е
М
для пом
зуется .
й
и
событ

@end

Сигнатура методов IBActio
n может не содержать
аргументов, иметь один арг
умент типа ID (аналог
ссылки на Object в языке Jav
a) или два аргумента,
в одном из которых переда
ется идентификатор
отправителя, а в другом —
UIEvent* для события,
инициировавшего вызов.

@end: завершает объявление интерфейса класса.

ViewController.h

дальше 

109

атрибуты свойств

Ñâîéñòâà èñïîëüçóþòñÿ äëÿ ýôôåêòèâíîñòè
Свойства позволяют создать методы чтения и записи для работы с объектом; они также
предоставляют дополнительную помощь. Так как создание этих методов поручается
компилятору, последний также может убедиться в том, что все свойства используются
в коде, и синтезировать методы доступа. И все это в одной строке кода!

@property (weak, nonatomic) IBOutlet UITextView *tweetTextView;
Атрибуты свойства

ViewController.h

Àòðèáóòû ñâîéñòâ ïåðåäàþò èíôîðìàöèþ êîìïèëÿòîðó
Чтобы указать, как именно должны работать методы доступа, вы объявляете атрибуты
свойств. Атрибуты делятся на три категории: возможность записи, семантика присваивания и атомарность. По умолчанию свойства атомарны. Это означает, что синтезированные методы доступа всегда возвращают или присваивают значение переменной
способом, безопасным в условиях многопоточного выполнения.
Полный список атрибутов можно найти в документации разработчика Apple.

Свойства безопасны,
потому что мы управляем
доступом к нашим переменным, верно?

Верно! Свойства защищают
переменные.
Определяя свойство, мы ограничиваем
возможность взаимодействия объектов
с данными нашего класса. Это способствует улучшению инкапсуляции и повышению контроля за работой с данными.

110

интермедия

Objective-C синтаксис

Кто и что делает?
ае
ае
Ниже перечислены наиболее часто используемые атрибуты свойств
и их определения. Соедините каждый атрибут с его определением.

read-only

strong

read/write

copy

weak

Вы хотите, чтобы свойство могло изменяться. Компилятор генерирует за
вас методы чтения и записи. Атрибут
используется по умолчанию.
Атрибут не продлевает жизнь объекта,
на который указывает ссылка. При отсутствии сильных ссылок на объект ему
присваивается nil. Сторона, получающая
такую ссылку на объект, не становится
его владельцем.
Используется при работе со значениями
объекта. Объект продолжает «жить»
до тех пор, пока в коде существует
хотя бы одна сильная ссылка на него.
Создавая такую ссылку, вы становитесь
владельцем объекта.
Вы не хотите, чтобы свойство могло
изменяться извне. Значение поля, для которого создано свойство, все еще может
изменяться, но компилятор не генерирует метод записи.
В свойстве должна храниться копия значения вместо самого значения; например,
если содержимое исходного массива не
должно изменяться после присваивания.
Передаваемому значению отправляется
сообщение копирования, результат которого и удерживается в дальнейшем.

дальше 

111

решение упражнения

Кто и что делает?
ае
ае
решение
Ниже перечислены наиболее часто используемые атрибуты свойств
и их определения. Соедините каждый атрибут с его определением.
Вы хотите, чтобы свойство могло изменяться. Компилятор генерирует за
вас методы чтения и записи. Атрибут
используется по умолчанию.

read-only

Атрибут не продлевает жизнь объекта,
на который указывает ссылка. При отсутствии сильных ссылок на объект ему присваивается nil. Сторона, получающая такую ссылку
на объект, не становится его владельцем.

strong

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

read/write

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

copy

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

weak

часто

Задаваемые
вопросы

В:

Как компилятор узнает, какое поле будет использоваться
для хранения значения?

О:

Когда компилятор автоматически синтезирует свойство, он генерирует для него переменную экземпляра. Имя переменной состоит из символа подчеркивания и имени свойства. Например, для
свойства с именем superSecretField будет создана базовая
переменная с именем _superSecretField. Имя переменной
можно изменить, добавляя директиву @synthesize, но мы рекомендуем использовать имя по умолчанию.

112

интермедия

В:
О:

Как насчет ключевого слова nonatomic?

По умолчанию генерируемые методы доступа обладают
потоковой безопасностью и используют мьютексы при изменении
значения свойства. Такой метод доступа называется атомарным
(atomic). Если ваш класс не будет использоваться в многопоточных условиях, безопасность оборачивается тратой ресурсов. Вы
можете приказать компилятору исключить проверку мьютексов,
объявляя свойство с атрибутом nonatomic. Учтите, что простое
объявление атомарных свойств не обеспечивает потоковой безопасности всего класса, так что будьте внимательны.

Objective-C синтаксис

Ïåðåäà÷à ñîîáùåíèé: êàê ýòî ïðîèñõîäèò â Objective-C
Чтобы взаимодействовать с другим объектом в Objective-C, вы передаете ему сообщение. Сообщение может содержать аргументы (а может и не содержать), а совокупность имени метода и
аргументов называется селектором. Помните: сообщения отправляются другому объекту, где они
обрабатываются реализацией метода.
Ниже приведено сообщение, используемое с элементом управления (мы использовали его
в InstaTwit; он выглядит как вращающееся колесо). Метод возвращает количество строк в заданном компоненте. Его объявление выглядит так:

п
емый ти
ода
Имя мет

Возвраща

го
Тип перво
а
т
ен
м
аргу

е имя
Локально
а
т
ен
м
аргу

ое имя
Открыт гумента
р
а
второго

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfR
owsInComponent:(NSInteger)component;
Тип втор
ого
аргумент
а

Локально
е
имя втор
ого
аргумент
а

Развлечения с магнитами
Перед вами сообщение из файла ViewController.m приложения Марко; оно приказывает
представлению composer задать его исходный текст. Постройте само сообщение и добавьте описания его фрагментов.

[

tweetText

@en
d

];

Получатель

Селектор

Передаваемый аргумент

setIntialText:

atomic
@property

composer

дальше 

113

решение упражнения

Развлечения с магнитами. Ответ
Перед вами сообщение из файла ViewController.m приложения Марко; оно приказывает представлению composer задать его исходный текст. Постройте само
сообщение и добавьте описания его фрагментов.

composer

[

setIntialText:

tweetText

];

Получатель

Имя метода

atomic
a

Передаваемый
аргумент

@en
d

@property

часто

Задаваемые
вопросы

В:

Что происходит с аргументами методов? Зачем там два имени, перед двоеточием и после типа?

О:

В Objective-C для аргументов можно
указывать два имени, открытое и локальное.
Открытое имя становится частью селектора,
когда кто-либо хочет отправить сообщение
вашему объекту. Это имя указывается перед двоеточием. Имя после типа относится
к локальной переменной, в которой хранится значение. В Objective-C эти имена
не обязаны совпадать, так что вы можете
использовать содержательное открытое
имя для людей, которые будут использовать
ваш класс, и удобное локальное имя для
своего кода.

В:

Вы упомянули о селекторах, но
я все еще плохо понимаю, что это такое.

114

интермедия

О:

Селекторы — уникальные имена методов, когда Objective-C преобразует сообщение в фактический вызов метода. Например,
найдите код, в котором используется селектор pickerView:numberOfRowsInCo
mponent. Мы еще вернемся к селекторам,
когда будем заниматься связыванием элементов интерфейса с программным кодом.
А пока Interface Builder делает все за нас.

В:

При отправке сообщения
resignFirstResponder использутся тип отправителя «id». Что это
значит?

О:

«id» — тип Objective-C, который может
представлять любой объект Objective-C.
Можно сказать, что это аналог void* в языке
C++. Так как Objective-C является языком с
динамической типизацией, отправка сообщений объекту типа «id» вполне допустима.
Исполнительная среда определит, способен
ли объект отреагировать на отправленное
сообщение.

В:

А что произойдет, если объект не
может отреагировать на сообщение?

О:

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

В:
О:

Все так серьезно — квадратные
скобки для передачи сообщений?
Да. И для индексирования массивов.
Привыкайте, это неизбежно.

Objective-C синтаксис

Вы говорите о каких-то «сообщениях»,
а по-моему, это самый обычный вызов
метода. Вам не кажется, что это глупо?

Сообщение — запрос на вызов метода с конкретным
именем и с конкретными аргументами. В Objective-C
приложение отправляет сообщения объектам, а те
реагируют на полученные сообщения.
Исполнительная среда Objective-C преобразует сообщение
в вызов метода, который возвращает значение. Таким
образом, обычно мы говорим об отправке некоторого сообщения, но когда вы реализуете то, что происходит при
получении сообщения, вы реализуете метод.

[foo: dosomething:x];

Objective-C
пытается связать
сообщение
с существующим
методом... И это не
всегда получается!

аргумент

x
doSomething

метод

РА

ССЛАБЬТЕСЬ

Objective-C

C создает
Objective- а основе
н
селектор
общения
вашего со
ся подои пытает ветстт
о
со
брать
етод.
вующий м

Возможно, что-то из сказанного вам покажется непонятным.
Тема достаточно глубокая... Но
дальше будет проще!

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

115

объекты используют сообщения

Как-то сложно все
получается. А это действительно так важно?

Сообщения позволяют определять получателей во время выполнения, а не во время компиляции.
Отправка сообщения —это механизм организации взаимодействия объектов друг с другом. С их
помощью вы приказываете объекту выполнить
операцию или вычислить некоторое значение.
Даже обращение к свойству преобразуется компилятором в сообщение.

Документация Apple основана
на терминологии с сообщениями.

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


В Objective-C приложение отправляет получателям
сообщения. Исполнительная среда преобразует их в
вызовы методов.



Объявления методов размещаются в заголовочном
(.h) файле после закрывающей фигурной скобки интерфейса.



116

Реализации методов размещаются в файле реализации (.m) между директивами @implementation
и @end.

интермедия



Для аргументов методов обычно определяются имена,
которые используются при отправке сообщений.



Аргументы могут иметь два имени: внешнее и внутреннее.



Методы экземпляров помечаются маркером “-”; статические методы помечаются маркером “+”.

Objective-C синтаксис

Ðàç óæ ìû çàíÿëèñü ñîîáùåíèÿìè....

Я открыл модный
магазин виниловых
пластинок, и я думаю,
что мне нужно
приложение...

Пора снова
поработать...
дальше 

117

ГЛАВА 2.5

Âàø èíñòðóìåíòàðèé ñèíòàêñèñà
Глава 2.5 осталась позади, а ваш
инструментарий разработки дополнился
некоторыми синтаксическими конструкциями.

Синтаксис сообщения:

[composer setInitialText:tweetText];
Получатель

Метод

на:
елятся
д
ы
с
с
ые
Кла
котор

лойсы (
терфе дятся в заго ут
н
И
о

г
х
о
а
м
н
), но
обычно
айле (.h ле .m как
ф
м
о
вочн
фай
ться в
находи ние класса)
ре
тся
расши
находя
а
д
г
е
с
в
и(
лизаци
 Реа йле .m)
в фа

Передаваемый аргумент

Свойства:
 Обладают атрибутами
.
 Атрибуты используются
для генерирования методов
доступа (чтения и записи).
 Способствуют инкапсуля
ции
функциональности.

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


В Objective-C приложение отправляет получателям
сообщения. Исполнительная среда преобразует их в
вызовы методов.



Объявления методов размещаются в заголовочном
(.h) файле после закрывающей фигурной скобки интерфейса.



118

Реализации методов размещаются в файле реализации (.m) между директивами @implementation
и @end.

интермедия



Для аргументов методов обычно определяются имена,
которые используются при отправке сообщений.



Аргументы могут иметь два имени: внешнее и внутреннее.



Методы экземпляров помечаются маркером “-”; статические методы помечаются маркером “+”.

3 Таблицы, представления и данные

Таблица и представление
Мне кофе с двумя кусочками
сахара, сливками, немного
корицы, дважды
перемешать, потом...

В большинстве приложений iOS используется несколько представлений. Мы написали симпатичное приложение с одним представлением.
И все же каждый, кто когда-либо пользовался смартфоном, знает, что типичное
представление одним представлением не ограничивается. Самые впечатляющие
приложения iOS используют при работе со сложной информацией несколько
представлений. Мы начнем с навигационных контроллеров и табличных представлений наподобие тех, которые используются в приложениях Mail и Контакты.
Вот только у нас они будут использоваться несколько иначе...

новое задание

Ïîçäðàâëÿåì!
Вам поручили новую работу — создание приложения для SpinCity, модного
магазина грампластинок. Владелец магазина, Роб, прислушивается к мнению
своих покупателей и обращается к вам с просьбой...

Rob @ Spin City
To: App Developer for Hire
!
Нужно приложение для моего магазина

Привет!
го покупателей, но есть
В моем магазине грампластинок мно
т на сайт, но не могут
одя
прих
ели
одна проблема. Покупат
нужен онлайновый пронайти то, что им необходимо. Мне
покупателю нужные
зать
давец, который может найти и пока
записи.
Поможете мне?
Роб

120

глава 3

таблицы, представления и данные

Ïðèëîæåíèå: êàòàëîã SpinCity
Приложение должно хранить данные о пластинках, имеющихся в магазине,
выводить их для покупателей с возможностью поиска. Так Робу будет проще
разобраться в его виниловых сокровищах, а поток посетителей начнет постепенно превращаться в денежный поток.
Каждая пластинка
хранится на определенном месте в магазине.

Hi-Fi-прилож
ение
адресовано счас
тливым покупат
елям!

Продавец вводит
все эти данные.

Вам поручено создать
приложение для
iPhone, которое будет
выводить информацию
о каждой пластинке:
местонахождение, цену
и описание. Приложению
понадобится полный
список всех пластинок.
дальше 

121

iOS и сенсорный экран

Êàê ðàáîòàþò ïðèëîæåíèÿ iOS
У нас довольно много информации, которую нужно как-то
то
передать пользователю. С местонахождением и ценой еще
ще
можно управиться, но сколько-нибудь подробное описание
ие
в строке таблицы точно не поместится.
а
Каждая пластинк
ейпредставляется яч
не
не
ра
эк
на
кой, но
я
хватит места дл
ин
й
мо
ди
хо
об
всей не
ся
формации! Придет
ельсоздать дополнит
е для
ное представлени
ия.
подробного описан

Ñåíñîðíûé ýêðàí
Приложения iOS стали одной из первых реализаций пользовательского интерфейса,
основанного на прикосновениях к сенсорному экрану. По этой причине, а также из-за
малого размера доступного экрана для одной задачи приложения с несколькими представлениями стали обычным явлением. Приложение SpinCity должно реагировать на
прикосновение пользователя к экрану, выдавая дополнительную информацию.

?
122

глава 3

В приложениях iOS с несколькими представлениями обычно используется
одно «главное» (Master)
представление и несколько «детализированных»
(Detail) представлений,
предназначенных для вывода расширенной информации. В нашем приложении
табличное представление
выполняет функции главного; также понадобится
детализированное представление для вывода всей
информации, которую нужно донести до пользователя.

таблицы, представления и данные

Развлечения с магнитами
Мы уже показали, как будет выглядеть первое представление. А из каких
частей вы бы собрали второе, детализированное представление?

Клавиатура

Представление #2

Панель навигации

UILabels

w

Imagevie

UIT
TextViiew
с текстомзаполнителем

Если вы
затрудняетесь
с ответом,
переверните
страницу — там
есть подсказка!
дальше 

123

иерархия данных

Èåðàðõè÷åñêèå äàííûå — çà ïðåäåëàìè òàáëè÷íîãî ïðåäñòàâëåíèÿ
Данные часто образуют отношения «родитель—потомок»: высокоуровневый блок данных
с дополнительными уточняющими данными. Например, эта модель часто встречается в приложениях для работы с контактной информацией и календарем. В нашем случае информация
о пластинках хорошо вписывается в иерархическую модель.

Данные верхнего уровня —
название пластинки.

Infected
Splinter

Album of the
Fall

Детализированные данные
состоят из информации
на наклейке, названий песен,
описания и местонахождения пластинки.

Èñïîëüçóéòå ñî÷åòàíèå òàáëè÷íîãî è äåòàëèçèðîâàííûõ
ïðåäñòàâëåíèé äëÿ ïðåäñòàâëåíèÿ èåðàðõè÷åñêèõ äàííûõ
Сочетание табличного представления с детализированным идеально подходит для таких видов данных.
В табличном представлении выводятся все элементы
верхнего уровня (в нашем случае названия пластинок),
а в детализированном представлении выводится подробная информация о каждой пластинке.
При построении приложений следует тщательно продумать, как будет использоваться каждое представление:
какую информацию вы хотите сообщить пользователю?
Как пользователь будет работать с этой информацией?
Разные представления часто ориентируются на разные
сценарии использования, поэтому, возможно, вы захотите добавить дополнительные кнопки (или, наоборот,
заблокировать часть функций) в зависимости от того,
в каком представлении находится пользователь и что
он пытается сделать.

124

глава 3

ecords
SpinCity R
Record #1
Record #2
Record #3

Title
Name:
Ingredie

Directio

nts:

ns:

таблицы, представления и данные

Откуда я это узнаю? Может, существуют какие-то
шаблоны для таких приложений? И разве программист не сам выбирает, как должно себя ввести
его приложение?

Компания Apple достаточно подробно
описывает поведение приложений iPhone
в документации HIG.
iOS Human Interface Guidelines (HIG) — поддерживаемый компанией Apple документ с перечнем
рекомендуемых правил и стандартных решений,
относящихся к пользовательскому интерфейсу,
для приложений App Store.
Когда вы приступите к вступительной части,
обратите внимание на примечание об использовании навигации в иерархических данных
(с детализированным представлением). Так как
эта схема взаимодействия встречается очень
часто, в среде Xcode для нее предусмотрен специальный шаблон приложения Master-Detail.

HIG
Документацию нИ
в
и
йт
можно на
ретернете по ад er.
op
el
ev
/d
су https:/
ry/
ra
ib
/l
om
e.c
pl
ap
tion/
ios/documenta
/
ce
en
ri
pe
ex
er
us
ilehig/
conceptual/mob zer
ni
ga
Or
не
ок
в
и
ил
олып

e
od
среды Xc
строке
по
к
ис
по
е
т
ни
terface
«iOS Human In
Guidelines»).

часто

В:

Соблюдать правила HIG обязатель-

но?

О:

И да, и нет. Всегда полезно следить за
тем, чтобы в вашем приложении соблюдались «правила iOS»; вы упростите жизнь будущих пользователей и рецензентов Apple,
которые будут проверять ваше приложение
при отправке в App Store.
Конечно, в приложении есть место для
оригинальности, но для базовых операций
(таких, как перемещение по иерархическим
данным) лучше придерживаться единых
правил, чтобы приложение соответствовало
ожиданиям пользователя. А творческие
наклонности проявить в областях, специфических для вашего приложения.

В:

Задаваемые
вопросы

Зачем переключать представления?
Почему бы не изменить текущее представление для вывода дополнительной
информации?

О:

Это одна из областей, в которых важную роль играют малый размер экрана и
схемы взаимодействий, принятые в iOS. Изза ограниченности экранного пространства
приложения iOS сильно ориентированы на
решение конкретных задач. Одна из самых
сложных проблем построения хорошего приложения — эффективная передача необходимой информации без «информационной
перегрузки» или чрезмерного усложнения
взаимодействий. Каждое представление
должно решать конкретную задачу, а при
его проектировании необходимо подумать
о том, как сообщить пользователю нужную
информацию простым и понятным способом.

В:

Как еще сенсорный экран влияет на
интерфейс приложений?

О:

При проектировании для сенсорного
экрана некоторые аспекты приложения полностью изменяются (скажем, по сравнению
с веб-программированием); важнейшее отличие заключается в том, что пространство
взаимодействия определяется размерами
кончика пальца, а не указателя мыши. Также
следует учитывать и другие аспекты — например, в интерфейсе перестает работать
такая привычная парадигма дизайна, как
наведение (hover).

дальше 

125

решение упражнения

Развлечения с магнитами — решение
Вот какое детализированное представление получилось у нас.
О том, как реализовать его, мы расскажем чуть позже.

Обычные
на
заполненн дписи,
ы
ными дан е нужными.

ии.

навигац
Панель

Здесь выво
дится изо
жение (а
браес
поле ост ли его нет,
ается пу
стым).

,
аблицы
ейки т
Это яч момент
т
но это дробно распо
буд ет
.
ен ниже
р
т
о
см

Текстовое поле
с описанием.

Детализиров
Детализированное
ванное
представление.

Такое детализированное представление получилось у нас. Если вы
предложили нечто иное — это нормально.

РАССЛАБЬТЕ

126

глава 3

СЬ

Мы взяли за образец стандартное приложение Контакты, но оригинальность приложения определяется его стилем и особенностями. Будьте
осторожны, определяя соотношение между оформлением и функциональностью, но обязательно придайте своему приложению толику
оригинальности. О том, как реализовать все это, мы расскажем далее.

таблицы, представления и данные

À òåïåðü íóæíî ñâÿçàòü ýòè äâà ïðåäñòàâëåíèÿ...
У нас есть два представления, но они никак не связаны между собой. Мы должны указать,
когда должно использоваться каждое из этих представлений, как должен происходить
переход между ними и какая информация необходима каждому из представлений для того,
чтобы оно могло выполнить свою задачу.

Детализированные представления.

Как таблица узнает, какие данные показывать в детализированном
представлении? И как пользователь возвращается к главному представлению?
Возьми в руку карандаш
Что нужно подключить, чтобы схема с двумя представлениями заработала?

Панель вкладок в нижней части главного представления.

Кнопки навигации.

Вспомогательное
приложение.

Обработка прикосновений
к ячейкам таблицы.
дальше 

127

решение упражнения

Возьми в руку карандаш
Решение

Что нужно подключить, чтобы схема с двумя представлениями заработала?

Панель вкладок в нижней части представления.
вления

для упра
к используется едставлениПанель вкладо
пр
вноправными
друг
несколькими ра
ть не связаны
бы
ут
ог
м
ые
!
ае
уч
сл
ем
ями, котор
ш
зно, но не в на
с другом. Поле

Вспомогательное приложение.
Термином «вспомогательное приложение» обычно
описывается узкоспециализированное приложение,
поддерживающее только одно или два представления — как, например, стандартное приложение
Погода или Акции для iOS.

Кнопки навигации.
Кнопки
да меж возврата и пе
ду пред
рехос
станов
ятся ча тавлениями
с
контро
ллера н тью
авигаци
и

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

Êîíòðîëëåð íàâèãàöèè îáåñïå÷èâàåò ïåðåìåùåíèå ìåæäó ïðåäñòàâëåíèÿìè
Контроллер навигации может управлять переходами между представлениями. Встроенные переходы уже
существуют, нужно лишь связать компоненты. Контроллер предоставляет такие функции, как кнопки
возврата, кнопки заголовка и историю просмотра, чтобы пользователь мог
перемещаться по данным, не рискуя заблудиться. Контроллер навигации
п
берет на себя такие аспекты, как определение размеров представлений и
б
ведение стека представлений; вам остается лишь сообщить ему, с какими
в
представлениями вы намерены работать.
п
ationController
Класс UINavig ею мноид
поддерживает
едставлений,
жественных пр
ду
ючаться меж
может перекл ением симж
ними с отобра
е
аций, а такж
им
ан
х
ны
ич
пат
ку
ж
ер
дд
енную по
имеет встро
ли навигации.
не
па
на
ок
кноп

128

глава 3

таблицы, представления и данные

часто

Задаваемые
вопросы

В:

Какие стандартные приложения iOS
используют контроллер навигации?

О:

Чтобы получить представление о том,
как работает контроллер навигации, присмотритесь к приложению Почта на iPhone
и iPad. На iPad используется контроллер навигации, сходный с iPhone, но позволяющий
одновременно отображать как главное, так
и детализированное представление. Это
позволяет iPad использовать дополнительное экранное пространство без изменения
схемы навигации между устройствами.
Другой хороший пример — приложение Календарь. Хотя оно поддерживает несколько
представлений (месяц, день, список или
неделя), по сути все равно управляется
контроллером приложений.

В:

Обязательно ли использовать табличное представление в качестве корневого?

О:

Нет, это всего лишь самый распространенный вариант, поскольку он предоставляет естественный способ отображения
сводки данных, по элементам которой пользователь может запросить дополнительную
информацию. Кроме того, табличные представления легко настраиваются, так что в
некоторых приложениях их даже не узнать,
как, например, в приложении Блокнот или
в магазине iTunes.

В:

Как контроллер навигации связан
с контроллерами представлений?

О:

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

В:

А если я захочу разместить наверху
свои кнопки — как, например, кнопку
редактирования в приложении Почта
для iPhone? Это не создаст проблемы
с контроллерами навигации?

О:

Вовсе нет — никаких проблем. Контроллер навигации поддерживает размещение
кнопок на верхней панели навигации, нужно
лишь приказать ему разместить кнопку в
нужном месте. Контроллер также поддерживает кнопку возврата к предыдущему
представлению.

В:

Вы упомянули о том, что на iPad
возможно одновременное отображение
главного и детализированного представлений. Это не усложняет программирование?

О:

В общем-то нет. На iPad существует
элемент управления SplitView, которому
передается главное и детализированное
представления. Это могут быть те же
представления, которые вы используете
в своем приложении для iPhone. На iPad
эти представления связываются контроллером SplitViewController (вместо контроллера
навигации, как на iPhone или iPod Touch).
Иногда на iPad можно увидеть главное представление, отображаемое собственным
контроллером навигации. Пример такого
рода встречается в приложении Почта на
iPad. Главное представление (в альбомном режиме) может отображать данные
учетных записей с возможностью перехода
на уровень папок, а затем на уровень конкретных сообщений. Всем этим уровням
соответствуют разные представления в
контроллере навигации. Когда вы прикасаетесь к сообщению, в детализированном
представлении (большая область справа)
отображается полная информация выделенного сообщения.

дальше 

129

выбор шаблона

Òðè ïðåäñòàâëåíèÿ â îäíîì øàáëîíå
Итак, вы достаточно хорошо представляете, что будет делать приложение (отображать записи и подробную информацию о них) и как
оно будет выполнять свою работу (при помощи контроллера навигации и табличного представления). Теперь можно браться за дело.
Запустите Xcode.

1

130

Выберите шаблон.
Создайте новый проект и выберите шаблон «Master-Detail
Application». В состав этого шаблона входят базовые представления
и контроллер навигации. Переименуйте продукт в «SpinCity» без
добавления префикса классов. Оставьте флажок «Use Core Data»
неустановленным.

глава 3

таблицы, представления и данные

2

Щелкните на кнопке «Next» и сохраните проект.
Сохраните новый проект там, где вам будет удобно. Xcode создает новое приложение iOS с табличным главным представлением и пустым детализированным
представлением.

3

Откройте раскадровку приложения.
Шаблон включает раскадровку со всеми представлениями проекта, включая
переходы. Щелкните на раскадровке; Xcode открывает ее в специальном редакторе. Давайте посмотрим, какие готовые возможности мы получили вместе
с шаблоном...

дальше 

131

storyboards под увеличительным стеклом

Storyboards под увеличительным стеклом
Раскадровкой (storyboard) называется представление в Xcode, которое появилось
в Xcode 4.2 и предназначено для работы с представлениями и переходами приложения
на графическом уровне. Сейчас, когда мы переходим к приложению с несколькими
представлениями, важно увидеть, как эти приложения связаны между собой.
Каждое представление в приложении называется
в раскадровке «сценой» («scene»).

Приложение состоит
из трех сцен

Стрелками об
означаются пути (s
egues)
между предст
авлениями.

Сцены отображают долю контента, предоставляемую контроллером представления. На iPhone это один экран, но на iPad на экране могут одновременно находиться несколько контроллеров (и их представлений). Также на раскадровке
изображены пути, которые соответствуют различным типам переходов между
представлениями. Некоторые пути могут включать модальные, или активные,
переходы и могут настраиваться пользователем. Сам путь представляет собой
объект, который создается для подготовки нового представления и используется
для передачи данных между представлениями.

132

глава 3

таблицы, представления и данные

Тест-драйв
1

Создайте приложение.
Запустите Xcode и создайте приложение SpinCity (см. инструкции на предыдущей странице). У вас появляется заготовка приложения для дальнейшей работы.

2

Задайте текст заголовка главного представления.
В редакторе раскадровки щелкните в области навигации контроллера главного
представления (Master View Controller). В редакторе свойств (справа) замените
значение свойства Title на «SpinCity Albums». Проследите за тем, чтобы флажок
«is initial view controller» под заголовком был установлен.

3

Постройте и запустите приложение!
Чтобы приложение заработало, вам ничего делать не придется; шаблон уже
готов к работе. Щелкните на кнопке Build and Run (кнопка воспроизведения) —
и любуйтесь результатом!

вое
Это пер лев
а
т
с
д
пре
оро е
ние, кот е на
т
и
д
и
в
у
вы
еобхоэкране. Н вить
а
димо доб переа
средств
етахода к д ному
н
а
в
лизиро
влению.
а
т
с
д
е
пр

Для новой за
п
создается вр иси
еменная мет
ка,
после чего
можно
переходить
к
детализиров
ан
ному предст авлению.

Итак, у нас имеются базовые представления
и переходы между ними. Теперь можно
переходить к работе с реальными данными.
дальше 

133

данные и mvc

У нас целых три представления... но нет данных! Как заполнить табличное представление
и детализированную информацию?

Джим

Джо: Контроллер представления TableView знает о табличном
представлении, поэтому данные можно сохранить здесь.
Джим: Но одного названия альбома недостаточно. Нам также
нужно будет сохранить все, что относится к детализированному
представлению.
Джо: Эти данные нужно где-то сохранить...
Фрэнк: ...только этим данным не место в контроллерах представлений.
Джим: Почему нет? Контроллер представления обладает
полной информацией о происходящем, так почему бы не сохранить в нем данные?

Фрэ
нк

Джо

Фрэнк: А что будет, когда нам потребуется добавить новый
альбом или отредактировать альбомы в другом представлении?
Получается, что все представления должны обладать информацией о контроллере главного представления?
Джо: Нет, я понимаю, к чему ты клонишь. Кажется, здесь
уместно использовать MVC?
Джим: Что такое MVC?
Фрэнк: MVC — паттерн «Модель—Представление—Контроллер». Он постоянно используется в веб-приложениях с такими
средами, как Ruby on Rails. Он означает, что визуальная сторона
(представление) отделяется от бизнес-логики (контроллер)
и от используемых данных (модель).
Джо: Но до настоящего момента мы всегда хранили логику
и данные в одном классе.
Фрэнк: Что ж, пора менять ситуацию. Нам потребуется отдельный класс для альбома, а также место для хранения данных.
Джим: Звучит разумно, но какая информация будет храниться
в этом классе?
Фрэнк: Необходимо определить поля для данных, построить
модель данных...

134

глава 3

таблицы, представления и данные

Ïàòòåðí MVC èñïîëüçóåòñÿ äëÿ ðàçäåëåíèÿ
îáÿçàííîñòåé...
Паттерн MVC встречается во многих инфраструктурах, а в Cocoa
Touch он применяется повсеместно. Паттерн MVC требует выделения
разных обязанностей в приложении в отдельные классы для сокращения сложности. В разработке iOS граница между представлением
и контроллером представления немного размыта, но обычно представление описывается в раскадровке, а бизнес-логика содержится в
контроллере представления.

яет
редставл
Модель п ложения. Обычи
данные пр носятся не
т
но к ней о твенно данбс
со
о
к
ь
л
ао
т
особ их хр зе
сп
и
о
ба
ные, н
к
я
лючени
нения: подк -служба или
еб
данных, в ассив объ ектов.
м
й
о
ст
о
пр

Модель
Представлени
е

Источник
данных

Представление

Представлени
е описывается в раск
адровке
(хотя описание
т
может строит акже
ься
в программно
м коде).
В этом описан
ии обозначены все эл
ементы
графического
интерфейса, с котор
ыми
может взаим
одействовать поль
зователь (кнопки,
т
стовые поля и ект. д.).

Контрол

лер

Делегат

Модель в MVC является концептуальной — в приложении нет единого
класса, обеспечивающего функции модели. Приложение может содержать несколько классов, совокупность которых рассматривается
как модель. Здесь важно то, что представление данных в приложении,
а также механизм работы с ними отделяется от представления и общего
управления потоком операций. В приложении SpinCity мы начнем с
класса, представляющего альбом, а потом будем постепенно строить
приложение.

делер (или
Контрол сит от
ви
легат) за задачи и сои
ку,
специфик
знес-логи м
би
т
и
ж
ер
ко
д
о
т
о
п
ю
щу
управляю риложения.
п
копераций
ся для реа
ет
зу
ь
л
о
ь
Исп
л
о
п
ствия
ции на дей переходы
и
я
ел
т
зова
ям
состояни
к разным
ями).
т
у
п
с
и
ни
(в сочета

дальше 

135

добавление новых классов

За сценой

Äîáàâëåíèå íîâîãî êëàññà

До сих пор мы работали только с классами, входящими в шаблон, поэтому для добавления нового класса в Xcode необходимо рассмотреть ситуацию более подробно. При создании нового
класса среда Xcode генерирует файлы заголовка и реализации с использованием мастера (wizard).
Вероятно, в этот момент также будет уместно упомянуть о папках в дереве файлов Xcode. На самом деле это всего лишь группы для упорядочения содержимого Xcode; они вовсе не обязаны
как-то влиять на фактическое местонахождение файлов на диске. Мы включим свой новый класс
в группу SpinCity.

Щелкни ой
в
а
р
п
е
т
...
кнопкой

136

глава 3

таблицы, представления и данные

1

Сгенерируйте класс
Сделайте правый щелчок на папке проекта SpinCity в Xcode и выберите команду New
File... На экране появляется диалоговое окно для создания нового класса. Убедитесь
в том, что в категории iOS выбран пункт Cocoa Touch; в правой части окна должен присутствовать вариант Objective-C class. Выделите его и щелкните на кнопке Next. Введите
имя класса Album и щелкните на кнопке Next; сохраните его в проекте SpinCity и группе
SpinCity. Убедитесь в том, что в поле Target по-прежнему выбран вариант SpinCity. Щелкните на кнопке Create.

напряги мозги
Итак, нам понадобится класс, представляющий альбом. Попробуйте составить список свойств, в которых будут храниться нужные
сведения. Подумайте, к какому типу должно относиться каждое
свойство. Также в классе альбома должен присутствовать один
метод. Какой? Если сможете догадаться — дополнительный балл!
са
ва клас
Свойст

класса
Метод
Album

дальше 

137

свойства и данные

Ñâîéñòâà ïðåäîñòàâëÿþò äîñòóï ê àòðèáóòàì êëàññà
Информация об альбомах, которая должна быть доступна пользователям, хранится
в классе Album. Для этого мы объявляем набор свойств, который преобразуется
компилятором Objective-C в методы доступа к полям класса. Обновите класс Album и
добавьте в него свойства для основных атрибутов: названия альбома, автора, сводного
описания, местонахождения в магазине и цены. Также в класс Album будет включен
метод для инициализации нового объекта Album, чтобы при создании нового объекта
можно было присвоить полям нужные значения.

Упражнение!

Новая модель данных понемногу начинает обретать конкретную форму. Откройте заголовочный файл и файл реализации
Album и приведите их к следующему виду.
аок созд
для стр яются
:
е
и
н
а
вл
им
у они я
ите вн
аниОбрат пии, поскольк float мы огр к
х
о
ы
к
т
данн
ем, а
ются
и. Для
ваивани
с
м
а
и
р
т
п
к
е
объ
тым
й тип.
ся прос
чиваем примитивны
о
как эт

@interface Album

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *artist;
@property (nonatomic, copy) NSString *summary;

тво
ится
шинс
Боль в относ ипу,
т
т
свойс оковому о
р
н
к ст еется од float
м
п
и
и
но
т а инки.
тво
свойс ны пласт
е
для ц

@property (nonatomic, copy) NSString *locationInStore;

Пять
в
свойст
данных,
е
которы а
н
о
п
нам
.
я
с
т
я
б
до

@property (nonatomic, assign) float price;

Метод инициализирует только что созданный объ ект Album.
Реализация метода
включается в файл .m.

-(id)initWithTitle:(NSString *)title artist:(NSString *)
artist summary:(NSString *)summary price:(float)price
locationInStore:(NSString*)locationInStore;
@end

Album.h

138

глава 3

таблицы, представления и данные

@implementation

Album

инициализаМы написали собственный
ия свойств
чен
зна
ает
зад
й
тор, которы
нтов.
уме
арг
на основании переданных

-(id)initWithTitle:(NSString *)title artist:(NSString *) artist
summary:(NSString *)summary price:(float)price locationInStore:(NSString
*)locationInStore {
self = [super init];
if (self) {
_title = title;
_artist = artist;

Всегда вызывайте инициализатор суперкласса.
Если произойдет что-то
нежелательное, он вернет
nil — как это делаем мы
в конце текущего метода.

мест,
Инициализаторы — одно из
C слегка
veecti
Obj
а
вил
пра
х
оры
в кот
_price = price;
х
ора
ат
лиз
циа
изменяются. В ини
_locationInStore = locationInStore; свойства не используются, вы обмпляращаетесь к переменным экзе
ить,
лож
дпо
пре
и
Есл
ую.
рям
ров нап
и
был
в
яро
мпл
экзе
return self;
что переменные
C,
veecti
Obj
вас
за
аны
ров
сгенери
}
по схеме
их имена будут построены
,
lf
e
s
е
т
й
e.
а
am
tyn
_proper
return nil;
ошла
возвращ
Всегда циализация пр —
и
т
н
е
и
ин
}
если
о. А есл
.
рмальн
..
о
il
н
n
е
т
@end
ай
возвращ

_summary = summary;

часто

Album.m

Задаваемые
вопросы

В:
О:

Откуда мы возьмем эти данные?

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

нием. Любое приложение, работающее
с DropBox API или iCloud, использует вебсервисы для получения и отправки данных.
Такие сервисы часто используются для обеспечения синхронизацииданных между
устройствами.

должение работы. На практике это весьма
неприятная ситуация, которая встречается
относительно редко. Тем не менее важно
соблюдать это правило, так как инфраструктура Cocoa Touch основана на соблюдении
этой схемы.

В:

В:

Что произойдет, если инициализатор
вернет nil?

О:

Возврат nil должен сообщить вызывающей стороне, что инициализация завершилась неудачей. Вызывающая сторона
должна обработать сбой и обеспечить про-

Как организовать вывод данных
для пользователя?

О:

Сначала нужно понять, как получить
используемые данные и создать все нужные объекты Album. Давайте пока начнем
с этого...
дальше 

139

загрузка и сохранение

Как организовать загрузку/сохранение
данных, которые будут представлены
объектами?
Сейчас у нас имеется класс, инкапсулирующий понятие альбома, но мы так и не
знаем, откуда будут браться эти данные.
Мы уже говорили о том, почему данные не
следует хранить в контроллере представления. Тогда где их хранить и как потом
до них добраться?
Это распространенная проблема/вопрос
в разработке для iOS. И мы вплотную подходим к одному важному паттерну...

140

глава 3

таблицы, представления и данные

Îáúåêòû äîñòóïà ê äàííûì ñêðûâàþò íèçêîóðîâíåâûå îïåðàöèè ñ äàííûìè
По аналогии с тем, как для работы с представлениями используется контроллер, мы используем класс для
маскировки фактической выборки данных, сохраняемых в экземплярах нашего класса Album. Скрывая
процесс выборки, мы избавляемся от необходимости загромождать контроллер представления кодом
SQL или вызовами веб-служб. Обращения к данным инкапсулируются в Объектах доступа к данным,
или DAO (Data Access Object).
Объекты DAO должны получать запросы вида «Мне нужен альбом 12» и преобразовывать их в запросы,
которые работают с данными, извлекают нужную информацию и передают ее контроллеру представления в некотором осмысленном виде.

То, что нам нужно, —
способ преобразования
данных в экземпляры
класса Album.

Контроллер
представления

Объект доступа
к данным

Данные

д е-то
анные г
Наши д я — в базе
с
в,
хранят писке свойст .
с
,
н
х
д
уго о
данны
бе... Где
ж
у
л
с
б
ве

Возьми в руку карандаш

аения дост
представл с объ ектами
у
ер
л
л
о
р
Конт
тать
еть рабо
ся к объточно ум может обращать
здание,
н
со
О
а
.
н
Album
осами
р
п
за
с
данных
O
е
ектам DA овление и удалени есует,
ер
обн
выборку,
его не инт
Album, и
в
о
т
.
ек
ся
ь
бъ
о
дет делат
как это бу

Итак, вы в общих чертах представляете, какая функциональность должна
быть реализована в DAO. Давайте попробуем создать объект DAO для приложения SpinCity. Среди перечисленных ниже вариантов пометьте то, что, по
вашему мнению, должно присутствовать в классе AlbumDataController.

Переходы между представлениями.

Предоставление данных по умолчанию для
альбомов.

Код инициализации
альбома при создании.

Действия по нажатию
кнопки добавления (+).

Изображения значков.

Код подсчета альбомов
и предоставления текущего значения счетчика контроллерам представления.

дальше 

141

решение упражнения

Возьми в руку карандаш
Решение

Переходы между представлениями.

Итак, вы в общих чертах представляете, какая функциональность должна
быть реализована в DAO. Давайте попробуем создать объект DAO для приложения SpinCity. Среди перечисленных ниже вариантов пометьте то, что,
по вашему мнению, должно присутствовать в классе AlbumDataController.

Предоставление данных
по умолчанию для альбомов.
массив

Изображения значков.

Действия по нажатию
кнопки добавления (+).

Код подсчета альбомов
и предоставления текущего значения счетчика контроллерам представления.

Размещаются
в списках plist
приложения

ать
ет содерж
еКласс буд ию, заполненный н .
н
и
а
м
ч
ы
л
н
о
н
м
у
да
по
ми
и исходны
которым

Код инициализации
альбома при создании.

Для з
а
предстполнения т
а
скольк авления не бличного
обходи
о альб
ставл
мо зн
омов
а
б
ено в
табли удет пред ть,
це...

И все это, как и прежде, нужно разместить в заголовочном файле?

На этот раз нет.
Помните: мы намеренно пытаемся абстрагировать
(читайте: скрыть) подробности реализации хранения данных. Объекты DAO рассчитаны на две
разные категории пользователей. Это внешний
мир, который желает получать и сохранять объекты Album, и реализация DAO, которой необходимо
до мельчайших подробностей знать, как именно
организовано хранение данных. Для этого нам
понадобятся два разных интерфейса: открытый
и закрытый (приватный).

142

глава 3

таблицы, представления и данные

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

Упражнение!

явление класса
Опережающее объ т здесь, поуе
Album присутств
ая информация
тому что подробн пока не нужна;
м
на
um
о классе Alb
, что такой
достаточно знать
т.
вуе
ест
сущ
асс
кл

#import

@class Album;
Возвращает объект Album с заданным индексом — при этом
мы не раскрываем
способ хранения
данных, а лишь
сообщаем, что
пользователь
контроллера
может осуществлять их выборку
по индексу. Выборка может
осуществляться
по уникальному
идентификатору альбома, по
местонахождению в магазине,
по имени и т. д.

@interface AlbumDataController : NSObject
- (NSUInteger)albumCount;

Нам понадобится счетчик альбомов,
чтобы табличное представление знало,
сколько ячеек нужно отобразить в
таблице. Обратите внимание: это
метод без аргументов, а не свойство.

- (Album *)albumAtIndex:(NSUInteger)index;
- (void)addAlbumWithTitle:(NSString *)title artist:(NSString
*)artist summary:(NSString *)summary price:(float)price
locationInStore:(NSString*)locationInStore;
@end

um с подходящей ин
Создаем новый Alb няем его. Вызываюра
формацией и сох ть, как это делается,
щему не нужно зна , что это работает.
достаточно знать

Включение файла «Album.h» — так как мы собираемся вызывать методы Album в этом классе, необходимо иметь информацию об интерфейсе Album.

AlbumDataController.h

Объявление свойства для массива
Добавляем закрытый интерфейс
NSMutableArray,
AlbumDataController. Здесь объявляв котором бу#import “Album.h”
ется то, что мы хотим использодут храниться
вать, но не включать в открытый
в
мо
ьбо
ал
е
ны
дан
(общедоступный) интерфейс. И здесь
е
ещ
х
ны
(база дан
@interface AlbumDataController () будет организовано хранение данных.
не используется).
Помните: под@property (nonatomic, readonly) NSMutableArray *albumList;
робности закрыего
шн
вне
Закрытый метод (не входит в отты от
крытый интерфейс), который бупользователя, и
— (void) initializeDefaultAlbums; дет использоваться для заполнения
их можно будет
массива данными по умолчанию до
изменить позднее
того, как мы организуем хранение
без нарушения ра- @end
информации в базе данных.
ботоспособности
программы.

Продолжение
на следующей
странице...

@implementation AlbumDataController
...
AlbumDataController.m дальше 

143

!
ение
н
ж
а
Упр

- (id) init {
self = [super init];
if (self) {

init, чтобы в нем
Обновите метод
для хранения дансоздавался массив
и контроллера
ни
ных, а при созда
наш новый метод
данных вызывался
ms.
bu
initializeDefaultAl

_albumList = [[NSMutableArray alloc] init];
[self initializeDefaultAlbums];
return self;
}
return nil;
}
- (void)initializeDefaultAlbums {

ms
initializeDefaultAlbu
Реализация метода открытый метод
ь
ат
должна использов
их
я создания нескольк
addAlbumWith… дл
ю.
ни
ча
альбомов по умол

[self addAlbumWithTitle:@”Infected Splinter” artist:@”Boppin’
Beavers” summary:@”Awesome album with a hint of Oak.” price:9.99f
locationInStore:@”Section F”];
[self addAlbumWithTitle:@”Hairy Eyeball” artist:@”Cyclops”
summary:@”A 20/20 retrospective on Classic Rock.” price:14.99f
locationInStore:@”Discount Rack”];
[self addAlbumWithTitle:@”Squish” artist:@”the Bugz” summary:@”Not your
average fly by night band.” price:8.99f locationInStore:@”Section A”];
[self addAlbumWithTitle:@”Acid Fog” artist:@”Josh and
Chuck” summary:@”You should know this stuff.” price:11.99f
locationInStore:@”Section 9 3/4”];
Реализуйте метод addAlbumWith… для создания нового объекта альбома по заданной
информации и включения его в массив.

}

- (void)addAlbumWithTitle:(NSString *)title artist:(NSString *)artist
summary:(NSString *)summary price:(float)price locationInStore:(NSString
*)locationInStore {
Album *newAlbum = [[Album alloc] initWithTitle:title artist:artist
summary:summary price:price locationInStore:locationInStore];
[self.albumList addObject:newAlbum];
}
- (NSUInteger)albumCount {

в albumCount
Реализации методо
то испольос
пр
и albumAtIndex
в с данными.
зуют базовый масси

return [self.albumList count];
}
- (Album *)albumAtIndex:(NSUInteger)index {
return [self.albumList objectAtIndex:index];
}
@end

144

глава
ва 3

AlbumDataController.m

таблицы, представления и данные

Ïîçäðàâëÿåì — âû òîëüêî ÷òî
ñîçäàëè ñâîé ïåðâûé îáúåêò DAO!
Осталось лишь убедиться в том, что Xcode не
выдает предупреждений и ошибок. Впрочем,
ничего интересного в приложении вы еще не
увидите — нужно связать его с табличным представлением. Пока же нам предстоит немалая
работа.

часто

Задаваемые
вопросы

В:

Зачем все это было нужно? Почему
нельзя было просто добавить массив
в контроллер представления?

О:

Можно, но у контроллера представления уже есть свои дела. В iOS контроллеры
представлений нередко превращаются в
«свалку» для кода, которому там не место.
Мы воспользовались стандартным паттерном, который упростит последующие
изменения, если в будущем мы захотим
добавить в приложение поддержку базы
данных или Core Data.
Использование паттерна DAO существенно
упрощает сопровождение кода и соответствует коду Apple, который вы можете загрузить при просмотре демонстрационных
приложений.

В:

Я все еще плохо понимаю, зачем
нужно это деление на открытый и закрытый интерфейсы. Почему мы поместили директиву @interface в файл
реализации?

О:

Objective-C использует ключевое
слово @interface для определения места,
в котором объявляются свойства и методы
класса. Обычно @interface используется
в заголовочном файле для объявления
открытого интерфейса класса. Другие
классы включают заголовочный файл и
знают, что им может предложить этот класс.
Однако часто встречаются ситуации, в которых требуется создать внутренние свойства
и методы, используемые только внутренней
реализацией и не предназначенные для
посторонних. При этом все равно удобно
использовать синтаксис свойств; просто
вы не хотите, чтобы посторонние лезли
во внутреннюю реализацию. Для этого в
файле реализации объявляется закрытый
интерфейс, который создается включением
в файл реализации секции @interface. Поскольку этот файл видим только непосредственной реализации класса, только этому
коду известно о существовании интерфейса.

В:

И никакой другой код не сможет вызвать мои закрытые методы?

О:

Более или менее правильно. Так как
закрытые методы не объявляются в заголовочном файле, другой код не должен
знать об их существовании. Objective-C
поддерживает динамический вызов методов посредством передачи сообщений и
не мешает стороннему коду проанализировать ваш класс во время выполнения
и отправить ему сообщение, на которое
ваш класс отреагирует. Компилятор выдаст
грозное предупреждение, которое напугает
слабонервного нарушителя, но технически
такая возможность существует.

В:

Значит, вот что имеет в виду Apple,
когда предлагает «не использовать закрытые API»?

О:

ДА! Именно. Попробуйте поэкспериментировать с вызовом закрытых методов для
классов CocoaTouch, и ваше приложение
моментально вылетит из App Store!

Переходим
к связыванию объекта
DAO с представлением!
дальше 

145

получение информации из DAO

А теперь остается лишь настроить контроллер главного
представления для получения
информации от объекта DAO,
верно?

Точно!
Теперь у нас есть хранилище для данных и механизм обращения к ним. Следующим шагом должно стать связывание этих компонентов с контроллером
представления и табличным представлением. Всего несколько несложных
операций — и вы увидите на экране
данные всех только что созданных
альбомов.

Организуйте
ю
их совместну
работу!

Объект доступа
к данным

146

глава 3

Контроллер
представления

таблицы, представления и данные

Упражнение

Настройте MasterViewController для работы с классом AlbumDataController. Разумеется,
в шаблонном коде эта настройка не выполняется, так что придется внести пару изменений...

1

Удалите часть шаблоннного кода из MasterViewController.m.
Наше приложение выходит за рамки простейшего шаблона, поэтому шаблонный код придется отредактировать. Удалите объявление
NSMuteableArray в закрытом интерфейсе, создание кнопки из
viewDidLoad, методы insertNewObject и commitEditingStyle.
Наконец, измените метод canEditRowAtIndexPath так, чтобы он
возвращал NO вместо YES.

2

Добавьте код для работы с AlbumDataController
в MasterViewController.m.
Добавьте директивы импортирования классов
AlbumDataController и Album в начало файла. Объявите
свойство для хранения AlbumDataController и инициализируйте свойство AlbumDataController в awakeFromNib.

дальше 

147

решение упражнения

Настройте MasterViewController для работы с классом AlbumDataController. Разумеется,
в шаблонном коде эта настройка не выполняется, так что придется внести пару изменений...
1

Удалите часть шаблоннного кода из MasterViewController.m.
Наше приложение выходит за рамки простейшего шаблона, поэтому шаблонный код придется отредактировать. Удалите объявление NSMuteableArray
в закрытом интерфейсе, создание кнопки из viewDidLoad, методы
insertNewObject и commitEditingStyle. Наконец, измените метод
canEditRowAtIndexPath так, чтобы он возвращал NO вместо YES.
/

- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.leftBarButtonItem = self.editButtonItem;
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWit
hBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@
selector(insertNewObject:)];
self.navigationItem.rightBarButtonItem = addButton;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void)insertNewObject:(id)sender
{
if (!_objects) {
_objects = [[NSMutableArray alloc] init];
}
[_objects insertObject:[NSDate date] atIndex:0];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITab
leViewRowAnimationAutomatic];
}

148

MasterViewController.m
глава 3

таблицы, представления и данные

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath
*)indexPath
{
return NO;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellE
ditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_objects removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITabl
eViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
}
}

MasterViewController.m

2

Добавьте код для работы с AlbumDataController в MasterViewController.m.
Добавьте директивы импортирования классов AlbumDataController и Album в
начало файла. Объявите свойство для хранения AlbumDataController и инициализируйте свойство AlbumDataController в awakeFromNib.

#import “MasterViewController.h”
#import “DetailViewController.h”

#import “AlbumDataController.h”
#import “Album.h”

Ссылка на объект AlbumDataController
является сильной (strong); это означает,
что она не будет уничтожена даже при
выгрузке представления.

@interface MasterViewController ()

@property (nonatomic, strong) AlbumDataController
*albumDataController;
@end

MasterViewController.m

дальше 

149

решение упражнения

Настройте MasterViewController для работы с классом AlbumDataController. Разумеется,
в шаблонном коде эта настройка не выполняется, так что придется внести пару изменений...

@implementation MasterViewController
- (void)awakeFromNib
{

Здесь можно провести разовую инициализацию при первом создании представления. Учтите, что представление
на экране еще не отображается.

[super awakeFromNib];

self.albumDataController = [[AlbumDataController alloc] init];
}

MasterViewController.m

Âïåðåä!!

Все готово, можно ехать!
Данные и логика работы с ними
расставлены по местам. Садитесь
за руль — пора заставить табличное представление поработать.

150

глава 3

таблицы, представления и данные

Òàáëèöà ñîñòîèò èç ÿ÷ååê
Теперь, когда вы знаете, как получить доступ к объектам Album, нужно как-то вывести их на экран. Для
этого мы воспользуемся табличным представлением. В настоящий момент у нас имеется лишь несколько
объектов Album, созданных для примера, но при работе с полным каталогом магазина придется иметь дело
с сотнями и даже тысячами альбомов. Вместо того чтобы загружать все данные и пытаться их втиснуть
в таблицу одновременно, табличное представление оптимизирует использование памяти: если ячейка
находится за пределами экрана, для пользователя совершенно неважно, содержит она данные или нет.

n
ai
pt
Ca

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

ecr
ack
er

Компоненты UITableView отображают столько данных, сколько необходимо для заполнения экрана
iPhone или представления в iPad — и не важно, сколько данных у вас может быть на самом деле. Для
этого UITableView эффективно использует ячейки, находящиеся за пределами экрана.
Ячейки, невиди
мые в предст
авле
остаются в ре
зерве до тех по нии,
пока iOS не по
требуется за р,
ни
емая ими пам
ять или табли мачн
представлени
е не использует ое
повторно при
их
очередной прок
рутке.
Во врем
я
крутки прон
екотор
ячейки
ые
в
границы ыходят за
экрана.

Firecracker

Datasource

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

оведанных пр
Источник ли в резервной
ряет, нет еек, пригодных
яч
области
ользоорного исп ейка
вт
о
п
ч
для
я
я
а
к
и та
вания. Есл н просто замео
имеется, жимое строки
няет содер ет строку.
а
и возвращ
р едое п ерет
н
ч
и
б
Табл вление у и вы
к
а
й
н.
а
р
ст ю яче
к
э
нову т ее на
и
д
во

Lemon Drop

Активн
о
предст е
авление с яч
е
таблиц йками
ы, которые
в
в наст идны
оящий
момент
.

Absolut Mixer
Bee Stinger
Cupid’s

Mojito
Miami Vice
Captain

Хорошо,
и что нужно сделать, чтобы эти данные
появились в табличном
представлении?

дальше 

151

ячейки таблицы крупным планом

Код ячейки таблицы под увеличительным стеклом
Методы табличного представления находятся в классе MasterViewController (что
вполне разумно, поскольку главное представление отвечает за табличное). Код шаблона
содержит методы для табличных представлений, а также дополнительный код (закомментированный) для переупорядочивания ячеек. Наше приложение предоставляет
доступ к данным только для чтения, так что этот код нам не понадобится.

#pragma mark — Table View
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}

Методы сообщают таблично
му
представлению, сколько сек
ций
содержит таблица и скольк
о
строк в каждой секции.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)
section
Обновите табличное
{
представление, чтобы поreturn [self.albumDataController albumCount]; лучить количество строк
от albumDataController
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS
IndexPath *)indexPath
indexPath содержит
представление сек
ции
и количество стро
к в необходимой яч
ейке.
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
@”AlbumCell” forIndexPath:indexPath];

Album *album = [self.albumDataController albumAtIndex:indexPath.row];
NSDate *object = _objects[indexPath.row];
cell.textLabel.text = album.title;
return cell;
}

Текст ячейки обновляется
информацией о конкретном
но
альбоме, который нам нуж
вывести на экран.

связывает ячейку с кодом,
Идентификатор AlbumCell
.
своить содержательное имя
при
поэтому ему необходимо
ке.
ров
кад
рас
в
ть здесь и
Это имя необходимо измени

152

глава 3

MasterViewController.m

таблицы, представления и данные
Вторая часть назначения
имени ячейкам таблицы...

MainStoryboard.storyboard

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@”showDetail”]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

Album *album = [self.albumDataController albumAtIndex:indexPath.row];
NSDate *object = _objects[indexPath.row];
[[segue destinationViewController] setDetailItem:album];
}
}

ный альбом и пеЭтот код получает выбран
нному представова
зир
али
редает данные дет
виться на экране.
лению, которое должно поя

MasterViewController.m
дальше 

153

тест-драйв

Тест-драйв
После того как табличное представление будет связано
с данными, можно запустить приложение и просмотреть
альбомы, которые были помещены в табличное представление через DAO. Если хотите, добавьте в DAO еще
несколько альбомов!


сь сами
Убедите е и прощ
список е ся!
т
кручивае

часто

Задаваемые
вопросы

В:

Для чего нужны методы, которые
мы удалили из MasterViewController?

О:

Класс MasterViewController
наследует от
UITableViewController —
встроенного класса для работы с
табличными представлениями. Табличное
представление настроено для испоьзования нашего контроллера представления
как источника данных и делегата; это
означает, что когда в программе что-то
происходит, табличное представление
будет вызывать методы контроллера
представления.
В исходном виде шаблонный контроллер
представления поддерживает размещение кнопки + для добавления новых
элементов, а также возможность удаления
и перестановки элементов списка. В на-

154

глава 3

шем приложении такая функция отсутствует, поэтому мы удалили шаблонные
методы. Полный перечень доступных
методов делегата приведен в описании
протокола UITableViewDelegate
в документации iOS.

В:
О:

А что происходит с путями?

Помните, как в раскадровке две
сцены соединялись активным путем
(переходом)? Шаблонный код настроекн
так, чтобы при прикосновении к строке
инициировался этот путь. Он выполняет
необходимую подготовку следующего
представления, после чего обращается
с обратным вызовом к контроллеру представления, уведомляя его о готовящемся
переходе (вызов prepareforSegue,
который мы заполнили кодом). В методе
prepareForSegue именно это и
происходит: мы готовимся к появлению

следующего представления. Иногда в
нем закрываются сетевые подключения
или выполняются другие завершающие
действия для уходящего представления.
В других случаях (как в нашем) необходимо сообщить новому представлению,
которое собирается появиться на экране,
о происходящем. Мы просто берем новое
представление из пути и сообщаем ему,
к какому альбому прикоснулся пользователь. Новое представление открывает
доступ к методу setDetailItem
(через свойство). Если бы с новым представлением, готовым появиться на экране,
нужно было выполнить какие-то дополнительные действия, это тоже можно было
бы проделать здесь. Обратите внимание
на проверку пути, выполняющего переход,
в коде метода — может оказаться, что из
представления выходят сразу несколько
путей, ведущих в разные места.

таблицы, представления и данные

Сюрпри

з

В принципе неплохо, но для меня
в табличном представлении маловато
информации... Нельзя ли вывести в ячейке
более подробные сведения?

Конечно!
Обговорив все с Робом, мы решили, что
в ячейке табличного представления
также должно выводиться краткое описание:

видеть
Что я хочу ране:
эк
на первом
ьбома
Название ал ание
ис
оп
е
ко
Крат
Цена

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

ых
Неправильн ь
ес
зд
ов
ответ
ет...
ож
м
не
ь
т
бы

И помните,
что можно
использоват
ь
более одного
столбца...

дальше 

155

решение упражнения

Возьми в руку карандаш
Решение
Самым заметным
элементом ячейки должно быть
название альбома;
я
под ним выводитс
.
ие
ан
ис
оп
е
ко
крат

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

Íàçâàíèå
Öåíà
Сводка

Здесь по правилам Apple должен находиться
индикатор вывода
дополнительной
информации...

Ðàñêàäðîâêà ìîæåò ïðèãîäèòüñÿ äëÿ ìàêåòîâ ñ íåñòàíäàðòíûìè
ÿ÷åéêàìè òàáëè÷íûõ ïðåäñòàâëåíèé
До настоящего момента мы использовали стандартные макеты ячеек табличных представлений. Они работают нормально, но этого мало. У ячеек табличных представлений существует пара стилевых модификаций со свойствами
detailTextLabel и imageView. Если они подойдут для вашего приложения,
используйте их. А мы покажем, как создать нестандартную ячейку, это не трудно,
и вы можете делать со своими ячейками все, что угодно.
Так как мы не будем использовать ячейки по умолчанию, нам придется создать
новый класс, производный от базового UITableViewCell, и добавить дополнительные свойства, которые должны отображаться на экране.

Код ячейки
таблицы по
умолчанию.

UITableViewCell

анКод нест ейки
ч
я
й
дартно
.
ы
ц
и
бл
та

AlbumTableViewCell

156

глава 3

Начните с этого
варианта и опробуйте разные типы
ячеек. Ни один
из стандартных
вариантов нам
не подойдет.

таблицы, представления и данные

ПОСТРОЕНИЕ НЕСТАНДАРТНОЙ ЯЧЕЙКИ ТАБЛИЦЫ
Чтобы построить новую ячейку таблицы, необходимо создать новый класс,
производный от класса UITableViewCell.

1

Создайте новый класс Objective-C с именем
AlbumTableViewCell, производный от
UITableViewCell. Проследите за тем, чтобы он
находился в группе SpinCity и чтобы проект SpinCity
был выбран в качестве целевого.

2

Затем следует изменить раскадровку, чтобы в ней использовалась новая
нестандартная ячейка (вместо ячейки по умолчанию). Вернитесь к файлу
MainStoryboard.storyboard и щелкните на пустой ячейке табличного представления в сцене Table View.
е пустую
Выделит мените
ячейку и за и табличк
класс ячей авления
ст
ед
р
п
,
ного
м классом
своим новы ViewCell.
le
AlbumTab

Ячейке должен быть
stom.
назначен стиль Cu

дальше 

157

нестандартные ячейки таблицы

ПОСТРОЕНИЕ НЕСТАНДАРТНОЙ ЯЧЕЙКИ ТАБЛИЦЫ
(ПРОДОЛЖЕНИЕ)
Теперь для создания макета с новыми ячейками нам предстоит работать в раскадровке и перетаскивать элементы на ячейку, как мы это делаем с элементами представлений.

3

Перетащите надпись для названия
альбома. Разместите
в верхней половине
ячейки с рекомендованным левым
отступом. Установите ширину равной
приблизительно
половине ячейки.
Замените текст
по умолчанию на
albumTitle.

4

Перетащите вторую
надпись, предназначенную для краткого описания. Разместите ее в нижней
половине ячейки
с рекомендуемым
левым отступом и задайте ширину в 3/4
от ширины ячейки. В инспекторе
атрибутов выберите
12 пт и светло-серый цвет. Замените
текст по умолчанию
на albumSummary.

5

158

Текст в
ячейках
япредставл и
дп
а
н
ется
el).
сями (Lab

Надпись для вывода цены разместите по центру ячейки с рекомендуемым правым отступом. Выберите шрифт Marker Felt Thin, 14 пт, и режим выравнивания текста по правому
краю. Растяните надпись влево до правого края надписи с кратким описанием. Замените
текст по умолчанию на price.

глава 3

таблицы, представления и данные

Тест-драйв
Макет ячеек построен, осталось лишь связать надписи со ссылками IBOutlet
и действиями. Сделайте это, и вы сможете увидеть новые ячейки в действии!
1

Откройте Assistant Editor и выберите файл AlbumTableViewCell.h.
Раскадровка должна располагаться рядом с представлением Assistant Editor. Перетащите указатель мыши с нажатой клавишей Control с надписи albumTitle в позицию
между директивами @interface и @end в файле AlbumTableViewCell.h. Убедитесь
в том, что для связи выбран тип Outlet. Введите имя albumTitleLabel, выберите тип
UILabel и слабую (weak) ссылку.

2

Повторите процесс для надписей albumSummaryLabel и priceLabel.
Когда все будет сделано, на полях рядом с файлом AlbumTableViewCell.h должны появиться
три заполненных кружка.

3

Откройте файл MasterViewController.m.
Добавьте директиву импортирования файла «AlbumTableViewCell.h» и обновите
метод cellforRowAtIndexPath, чтобы в нем использовался новый тип нестандартной ячейки.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP
ath *)indexPath
{

AlbumTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”AlbumCell”
forIndexPath:indexPath];
Album *album = [self.albumDataController albumAtIndex: indexPath.row];
cell.albumTitleLabel.text = album.title;
cell.albumSummaryLabel.text = album.summary;
cell.priceLabel.text = [NSString stringWithFormat:@”$%01.2f”, album.price];
return cell;
}

4

Запустите приложение....

дальше 

159

тест-драйв

Тест-драйв

Ðàáîòàåò!

ите
Обрат е на
и
н
а
вним
дартн
а
т
с
е
н
йки
ные яче ...
ы
ц
табли

Список
п
кручива роется,
и все т
акое.

160

глава 3

таблицы, представления и данные

Мне нравится, но когда я
прикасаюсь к строке, детализированная информация
не выводится!

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

дальше 

161

ГЛАВА 3

Âàø èíñòðóìåíòàðèé ïðåäñòàâëåíèé
Глава 3 осталась позади, а ваш
инструментарий пополнился табличными
представлениями.

дые пр е
н
н
е
в
ст
Множе
ения
сставл
ениях и

илож
колько
гих пр
азу нес
Во мно
р
с
я
с
ют
пользу влений.
а
т
с
ход
е
р
п
ления
едстав четании
р
п
е
ы
н
о
Таблич ботают в с для проа
и
р
м
о
ы
ш
н
.
о
н
р
зирова еских данных
и
л
а
т
ч
и
х
с де
р
а иера
смотр
оллер
контр
ду
й
ы
н
н
о
ци
ды меж
Навига вает перехо
чи
обеспе влениями.
а
т
предс

Раскадро
в

ки

Использ
уются д
ля редак
рования
тивсех пре
дставле
вашего п
ний
риложен
ия и пер
между н
еходов
ими.
Здесь т
акж
тироват е могут редак
ьс
ячейки т я нестандартн
ы
абличны
х предст е
лений.
ав-

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ

162

глава 3



Приложения iOS основаны на прикосновениях к сенсорному экрану —
и они были первыми в этой категории.



Объекты доступа к данным (DAO,
Data Access Objects) используются
для сокрытия низкоуровневого доступа к данным.



MVC — главный паттерн проектирования в приложениях iOS.



Ячейками табличных представлений
управляют объекты UITableView.

4 приложения с несколькими представлениями

Такие важные подробности
Подробности бывают очень
важными — скажем, где стоят
деревья...

В большинстве приложений iOS используется более одного
представления. Работа над приложением началась резво: мы воспользовались встроенными шаблонами и внесли довольно впечатляющие изменения
в табличное представление. Пришло время заняться выводом подробной
информации, подготовкой нового представления и управлением навигацией
между ними. Многие популярные приложения в App Store предоставляют
удобные и простые средства для работы с большими объемами данных.
Приложение Spin City делает то же самое — оно помогает пользователю
найти нужную пластинку, не перерывая многочисленные конверты на полках!

детализированные представления

Äåòàëèçèðîâàííûå ïðåäñòàâëåíèÿ
Приложение SpinCity работает и рисует симпатичную таблицу с данными.
Теперь, когда мы видим высокоуровневую сводку, пора заняться детализацией. На рисунке изображено детализированное представление, которое
мы предложили ранее.
и

и
навигац
Панель ке.
ов
в загол

Здесь буд
ет
диться изо вывображение
(если оно
есть —
в противн
о
поле ост м случае
ается
пустым).

Надписи,
за
ные прави полненл
данными. ьными

это
ом деле
На сам аблицы...
т
ячейки
ть
том чу
э
б
о
Но
позже.
Текстовое поле
с возможностью
редактирования
текста.

Äåòàëèçèðîâàííûå ïðåäñòàâëåíèÿ ïîâñþäó
Детализированные представления используются во многих приложениях, и каждый, кто
хоть раз пользовался ими, примерно представляет, для чего они нужны. Детализированные
представления обычно находятся на нижнем уровне иерархического стека представлений;
это означает, что в них выводится самая подробная информация, которую только может
предоставить приложение.
Детализированные представления также используются для перевода приложения в другой
режим работы (представьте, что вы выходите из поставки новостей и переходите к стене в
своем приложении Facebook). В последнее время приложения становятся более сложными,
поэтому в них могут появиться дополнительные уровни взаимодействия, для обращения
к которым могут использоваться разные детализированные представления.
В нашем приложении табличное представление содержит довольно подробную информацию
об альбоме, и это хорошо. И все же нужно предусмотреть возможность вывода еще более
полной информации, чтобы покупатель мог узнать о сокровищах Роба все, что душа пожелает.

164

глава 4

приложения с несколькими представлениями

В основном это надписи и текстовые
поля, верно? Как разместить их так,
чтобы они хорошо смотрелись? А если
название альбома окажется слишком
длинным?

Всегда старайтесь найти подходящее
встроенное представление.
Макет можно построить вручную, и он будет
работать, но существует и более эффективный
способ — особенно при работе с текстовой
информацией.
Табличные представления можно настроить
так, чтобы макет выглядел более привлекательно, и при этом сохранить все преимущества табличной структуры. После предыдущей
главы вы можете считать себя настоящим
профессионалом, так что с настройкой табличного представления особых проблем быть
не должно.

Мозговой
штурм
Проверьте несколько приложений на iPhone или
iPad. Сможете ли вы определить, какие из них
используют табличные представления в детализированных данных, а какие нет?

дальше 

165

из табличных представлений получаются хорошие детализированные представления

Òàáëè÷íûå ïðåäñòàâëåíèÿ íå âñåãäà ïîõîæè íà...
òàáëèöû
Вы уже видели пример использования табличного представления в главном представлении. Таблицы хорошо подходят для
построения аккуратных макетов (как при использовании таблиц
в текстовых документах или электронных таблицах), при условии,
что пользователь не может выделять данные в таблице.
Например, детализированные представления в приложении Почта или Контакты не похожи на таблицы, и все же являются ими...

всегда
ицы не
л
б
а
т
Но
!
т так
выглядя

часто

Задаваемые
вопросы

В:

В:

Что нам дает использование табличного представления
вместо определения макета в детализированном представлении?

Часто ли приложения поступают так? И что об этом думает
Apple?

О:

Постоянно! Если вы просто продолжите работать с привычными приложениями, то вы увидите, что это решение более характерно
для бизнес-приложений и офисных приложений, чем для нестандартных представлений. Apple также очень часто использует его
в своих приложениях...

Удобство построения макета и удобные встроенные инструменты. Табличное представление уже включает прокрутку и
встроенную навигацию; кроме того, позднее вы сможете подключить
к приложению новые представления без особых хлопот.

166

глава 4

О:

приложения с несколькими представлениями

Джо: Ладно, теперь нужно создать детализированное представление. С чего начать?

Джим

Фрэнк: Видимо, нужно вернуться к редактору раскадровки?
Джим: А что потом? Новое представление должно быть
табличным. А шаблон нам предлагает обычный класс
DetailViewController.
Джо: Значит, нужно заменить его, как мы это делали для ячеек
таблицы. Как ты думаешь, мы сможем просто воспользоваться
контроллером табличного представления из UIKit?
Фрэнк: Мы изменили табличное представление по умолчанию, чтобы главное представление выглядело так, как нужно
нам. Значит, придется создавать новый класс.
Джим: Верно, но тогда мы субклассируем контроллер табличного представления по умолчанию и получим всю встроенную
поддержку, а также возможность настройки макета?
Фрэнк: Точно. И мы можем построить собственную раскадровку для управления макетом.
Фрэ
нк

Джо

Джо: А как насчет отображения данных?
Джим: У меня есть кое-какие мысли относительно того, как
это сделать. Скажу, когда дойдет до этого.
Джо: Будь по-твоему. Итак, берем файл раскадровки...

дальше 

167

получение табличного представления

Çàìåíà UIViewController íà UITableView Controller
Так как шаблон главного представления поставляется с простейшим
детализированным представлением, нам нужно изменить класс этого
представления, чтобы автоматически получить все удобства табличных
представлений. Как и в случае с ячейками таблицы, нужные действия выполняются в инспекторе атрибутов.

#import

um
класс Alb
Объявите и интерфейса.
ам
за предел

@class Album;

ный
е обобщен вления
а
Заменит
ст
ед
р
.
ер п
контролл ableViewController
IT
U
м
о
сс
а
л
к

@interface DetailViewController : UIViewController UITableViewController
@property (strong, nonatomic) id Album *detailItem;
@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@end
Полностью удалите
надпись.

Замените обобщенн
ый идентификатор id на
Album.

DetailViewController.h

- (void)configureView
{
// Update the user interface for the detail item.
if (self.detailItem) {
self.detailDescriptionLabel.text = [self.detailItem description];
}
Удалите эту строку,
так как надписи больше нет.

}

168

глава 4

DetailViewController.m

приложения с несколькими представлениями

Кто и что делает?
ае
ае
Соедините каждый контроллер с описанием того, что он делает.

Контроллер
UIViewController

UINavitgationController

UITableViewController

UITabbarController

UIPageViewController

UIVideoEditorController

Что делает
Предоставляет стек навигации для переходов между представлениями; встраивает
панель навигации в верхней части представления.
Контроллер хорошо подходит для приложений с несколькими равноправными представлениями, чтобы пользователь мог легко
переключаться между ними.
Контроллер включает основные средства,
необходимые для работы с представлениями.
Предоставляет системный интерфейс для
редактирования видеоданных прямо на
устройстве.
Встраивает табличное представление в используемое представление. Может использоваться для детализированных представлений или более традиционного табличного
представления.
Контроллер используется для обработки
перемещений между контроллерами представлений с заданным переходом.

Ответы на стр. 196.
дальше 

169

макет табличного представления

Ìàêåò íîâîãî äåòàëèçèðîâàííîãî ïðåäñòàâëåíèÿ
Итак, наше приложение знает, что оно взаимодействует
с UITableViewController, а не с UIViewController. Теперь
на основании имеющегося эскиза мы займемся настройкой
элементов представления в раскадровке.
Замените детализированное представление табличным представлением в раскадровке.
Обеспечьте выполнение перехода между новым
детализированным представлением и табличным
представлением.
Постройте макет представления в соответствии
с эскизом.

Нужно ть
и
постро
.
..
о
т
э

170

глава 4

приложения с несколькими представлениями

Âêëþ÷åíèå ïðåäñòàâëåíèÿ â ðàñêàäðîâêå
Это нетривиальная часть работы, поэтому она будет описана весьма
подробно. Здесь мы отходим от шаблона, поэтому стоит более подробно
поговорить как о самом представлении, так и о том, как к нему перейти.
А начать следует с того, что мы уже делали в коде ранее.
1

В файле Main.storyboard удалите всю сцену
Detail View Controller.
Убедитесь в том, что в Xcode выделено все детализированное представление. Удалите его полностью.
Убедитесь в том,
что представление
выделено. Нажмите
клавишу Delete.

2

Перетащите контроллер табличного представления
(Table View Controller) на раскадровку, чтобы
заменить детализированное
представление.
При попытке выделить окно выделяется
представление, поэтому для выделения
контроллера представления следует выделить черное поле в нижней части.

Возьми в руку карандаш
Какой класс следует выбрать для нового представления?
MasterViewController
DetailViewController
UITableViewController
Почему?

дальше 

171

решение упражнения

Возьми в руку карандаш
Решение

Какой класс следует выбрать для нового представления?

MasterViewController
DetailViewController
UITableViewController
Почему? Потому что это представление одновременно является
ся
и детализированным, и табличным. На уровне класса его роль детализированного представления важнее роли табличного представления.

Îñòàëüíàÿ ÷àñòü ïðåäñòàâëåíèÿ ñòðîèòñÿ äèíàìè÷åñêè
Теперь нужно сформировать макет нового табличного представления.
В отличие от последнего табличного представления, в котором нужное
количество строк было неизвестно, на этот раз мы точно знаем, какая
информация будет выводиться, и используем табличное представление
для упрощения работы. В данном случае
е
вместо динамической таблицы будет
т
использоваться статическая таблица.

После выделения табличного представления
выберите в поле Content
значение «Static Cells».

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

Для любознательныхх
Мы также изменим тип разделителя ячеек. Не забудьте, что мы
пытаемся использовать табличное представление как детализированное. Обычно ячейки таблицы разделены одиночной линией, и после ее
удаления представления станут неотличимы.

172

глава 4

кторе,
В инспе eparator
S
л
е
д
раз
Insets.

приложения с несколькими представлениями
Выделите верхнюю ячейку табличного
представления; перетащите границу или воспользуйтесь инспектором,
чтобы установить высоту ячейки
равной 100 пунктам.
Перетащите
надпись в ячейку. Используя
рекомендации,
разместите ее
у правого края
представления
ImageView и растяните вправо
до границы ячейки. Выровняйте
ячейку с рекомендуемым верхним отступом.
В инспекторе
атрибутов выберите шрифт
System Bold.

Выделите
вторую и
третью
ячейки таблицы. В инспекторе
атрбиутов
выберите
для них
стиль Left
Detail.

eView
элемент Imag
Перетащите
тите
ес
зм
Ра
.
ячейки
в левую часть ,задав его высоту
ая
.
его у левого кр
и 60 пунктам
ым
вн
ра
у
и ширин
Перетащите
другую надпись
в ячейку. Разместите ее с рекомендованным отступом у правого
края ImageView,
прямо под добавленной надписью.
Растяните надпись до правого
рекомендованного
отступа табличного представления. Выберите
цвет Light Gray
Color и шрифт
System 12.0.

Убедитесь в том,
что для ячеек выбран тип Custom.
Перетащите границу ячейки, чтобы
ее высота была
равна 150 пунктам.

иДважды щелкн
‘Title’
те на метке
й
и введите новы
’и
текст ‘Аrtist
‘Дocation’.

ка.
еще одна ячей
Понадобится
ое
чн
ли
аб
ее в т
Перетащите
е.
представлени

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

А теперь
запустите!
дальше 

173

тест-драйв

тест-драйв

Íè÷åãî!

Это что, шутка? Столько
работы, и ничего не появляется?
Может, мы забыли создать
какие-то связи?

Нужно проложить путь
от главного представления
к детализированному.
При удалении представления также
был удален ведущий к нему переход.
Раскадровка позволяет не только
редактировать представления, но и
добавлять ведущие к ним переходы.

174

глава 4

приложения с несколькими представлениями

ставлены
Которые пред
енами.
сц
е
в раскадровк

Ïóòè ñîåäèíÿþò êîíòðîëëåðû ïðåäñòàâëåíèé

Пути изображают переходы между представлениями в раскадровках. Они появились относительно недавно (в iOS 6) и предоставляют широкие возможности для настройки переходов.
Ранее мы говорили о переходах между представлениями, но в редакторе раскадровки также
существует концепция сцены. На iPhone сцена всегда соответствует представлению, но на
iPad сцен в представлении может быть несколько (вообразите представление, в котором
используются две панели, постоянная и переменная, как, например, в стандартном приложении Почта). Путь описывает способ перехода от сцены к сцене, а не от представления
к представлению.
Существует несколько стандартных путей (один из которых будет использован в приложении
SpinCity), но вы также можете писать собственные реализации. iOS создает пути за вас, когда
в приложении активизируется соответствующий переход. Сначала создается конечная сцена,
затем объект пути; исходное представление вызывает prepareForSegue:sender:. Наконец,
вызывается метод perform объекта пути, и переход на этом завершается.

Путь
Сцена

Сцена

Путь определяет
переход
от сцены к сцене
(не обязательно
от представления
к представлению).

А теперь за работу...
дальше 

175

сцены в раскадровке

Ñâÿæèòå ñöåíû â ðàñêàäðîâêå
В приложении SpinCity две сцены не связаны между собой, так что мы не можем добраться
до только что созданного детализированного представления. Нам придется поработать
в редакторе раскадровки и добавить новый переход.
Сделайте правый щелчок на ячейке табличного представления,
чтобы вызвать панель путей и ссылок. Перетащите указатель
мыши с нажатой клавишей Ctrl на второе представление.

ом,
Убедитесь в т
ип
т
ан
бр
вы
о
чт
.
перехода Push

Вот
новый
од
перех

ь
Выделите пут
ен
и измените ид
тификатор на
tails.
ShowAlbumDe

176

глава 4

Xcode также автоматически добавляет
панель навигации в представление Push-перехода.

приложения с несколькими представлениями

часто

Задаваемые
вопросы

В:

Для чего нужны сцены? Кажется,
что-то лишнее...

О:

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

В:

Какие еще функции выполняют пути,
кроме связывания сцен?

О:

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

В:

Почему включение пути привело
к добавлению панели навигации в верхней части детализированного представления?

О:

Мы выбрали Push-переход, который
будет реализован через контроллер навигации. Xcode автоматически резервирует
место, необходимое для панели навигации.

тест-драйв
Запустите!

Открывается, но...
дальше 

177

наполнение детализированного представления

Все это, конечно,
хорошо, но где информация об альбоме?

Нужно лишь заполнить представление,
как это делалось ранее!
Детализированное представление отображается на экране, но мы не добавили действия и ссылки IBOutlet и не связали поля
с данными. Необходимо передать данные
представлению — по аналогии с тем, как это
делалось в приложении Марко.

178

глава 4

приложения с несколькими представлениями

Упражнение

Вы уже знаете, что делать; запустите Xcode и создайте необходимые связи
для детализированного представления.

1

Используйте режим Assistant Editor.
Убедитесь в том, что в раскадровке виден контроллер детализированного представления, а на панели Assistant Editor открыт файл
DetailViewController.h.

2

Создайте ссылки IBOutlet в детализированном
представлении.
Нам понадобятся ссылки IBOutlet для надписей в представлении:
albumTitleLabel, priceLabel, artistLabel, locationLabel
и descriptionTextView.

дальше 

179

решение упражнения

Посмотрим, как вам следовало настроить представления.

1

Используйте режим Assistant Editor.
Убедитесь в том, что в раскадровке отображается контроллер детализированного представления, а на панели Assistant Editor открыт файл
DetailViewController.h.

лер
Контрол
рованного
детализи
ения.
представл

180

глава 4

приложения с несколькими представлениями

2

Создайте ссылки IBOutlet в детализированном представлении.
Нам понадобятся ссылки IBOutlet для надписей в представлении:
albumTitleLabel, priceLabel, artistLabel, locationLabel
и descriptionTextView.

Проследите за
тем, чтобы была
выделена
нужная
надпись!

у Ctrl, перетаУдерживая клавиш
ши с названия
щите указатель мы
,
tailViewController.h
альбома в файл De
let
ut
лку IBo
чтобы создать ссы
abel.
leL
Tit
um
alb
с именем
#import
@class Album;
@interface DetailViewController : UITableViewController

@property (strong, nonatomic) Album *detailItem;
@property (weak, nonatomic) IBOutlet UILabel
*albumTitleLabel;
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UILabel *artistLabel;
@property (weak, nonatomic) IBOutlet UILabel *locationLabel;
@property (weak, nonatomic) IBOutlet UITextView
*descriptionTextView;

@end

Итоговый код со всеми
ссылками IBoutlet.

Ссылки размещаются
в заголовочном
файле, но не в файле
реализации...

DetailViewController.h

дальше 

181

развлечения с магнитами

Развлечения с магнитами
Ниже приведен код обращения к свойствам альбома в файле
DetailViewController.m.

- (void)configureView
{
// Обновление пользовательского интерфейса
// для элемента детализированного представления.
if (self.detailItem) {
self._________________.text = self.detailItem.title;
self._________________.text = [NSString
stringWithFormat:@”$%01.2f”, self.detailItem.price];
self._________________.text = self.detailItem.artist;
self._________________.text = self.detailItem.
locationInStore;
self._________________.text = self.detailItem.summary;
}

}

DetailViewController.m

summary

priceLabel

albumTitleLabel

self

iew
descriptionTextV

album
location.L
abel

182

глава 4

NSString

artistLabel

title

приложения с несколькими представлениями

часто

Задаваемые
вопросы

В:

Почему в классе Album для поля с кратким описанием используется имя
summary? Почему бы не назвать его description?

О:

Имя «description» уже присвоено методу класса NSObject, который должен возвращать текстовое описание экземпляра NSObject. По умолчанию метод возвращает имя
класса и адрес объекта в шестнадцатеричной записи. Метод можно переопределить,
чтобы он возвращал другую информацию — осмысленное описание объекта, которое
вовсе не обязано совпадать с кратким описанием, обычно приводимым на обратной
стороне компакт-диска. Мы не хотели создавать конфликт имен и поэтому использовали
название «summary».

напряги мозги
Почему этот код еще не работает? Представление еще не готово к заполнению. Есть какиенибудь мысли на этот счет? Подсказка: мы уже
говорили об этом в текущей главе...

дальше 

183

решение упражнения

Развлечения с магнитами
Заполните пропуски, необходимые для связывания данных
с детализированным представлением.

#import “Album.h”
- (void)configureView
{
// Обновление пользовательского интерфейса
// для элемента детализированного представления.

if (self.detailItem) {
self.

l
t
albumTitleLabe

.text
= self.detailItem.title;
.

priceLabel
self.
.text = [NSString
stringWithFormat:@”$%01.2f”,
self.detailItem.price];
t o at:@ $%0
thFormat:@”$%01

self.

artistLabel

.text = self.detailItem.artist;
.

self.

locationLabel

.text
= self.detailItem.locationInStore;
.t

self.

iew
descriptionTextV

.text = self.detailItem.summary;
.

}

}

DetailViewController.m

album
NSString

self

title

184

глава 4

summary

И снова недостающим
звеном является путь!

приложения с несколькими представлениями

Ïóòè ïîçâîëÿþò ïîäãîòîâèòüñÿ ê îòîáðàæåíèþ íîâîé ñöåíû
Пути не ограничиваются описанием перехода между сценами; в них также включаются
данные, которые должны передаваться между сценами. В нашем случае детализированному
представлению должна передаваться информация, которая находилась в выбранной пользователем ячейке таблицы. Благодаря этой информации детализированное представление
может обратиться к нужной записи и отобразить нужные данные.
Альбомы
SpinCity

Детализированное
представление

(табличное
представление)

Путь

Сцена

Сцена
Загрузить
нужный
альбом
название : -изображение: -описание: --

Погодите — детализированное
представление нормально работало, и мы не тратили время на
возню с кодом пути. Почему это
нужно делать сейчас?

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

дальше 

185

обновление пути

Îáíîâèòå ìåòîä îáðàòíîãî âûçîâà prepareforSegue
prepareforSegue и performSegueWithIdentifier — два метода, используемых iOS
для работы с путями на программном уровне. Хотя контроллер представления обрабатывает путь нормально, иногда в приложении встречаются передачи управления,
нуждающиеся в уточнении (например, если к представлению ведут сразу несколько
переходов). И если вы создали замечательный нестандартный переход, то вы также
сможете использовать его.
Метод performSegueWithIdentifier позволяет активизировать любой путь на программном уровне; при этом указывается строковый идентификатор, настроенный в
раскадровке. Метод prepareForSegue уже присутствует в нашем коде; по умолчанию
он переопределяется контроллером представления во время выполнения, но в нашем
случае необходимо указать задействованные контроллеры представления и необходимые данные.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)
sender
{
if ([[segue identifier] isEqualToString:@”showAlbumDetails”])
{
NSIndexPath *indexPath = [self.tableView
indexPathForSelectedRow];
Album *album = [self.albumDataController
albumAtIndex:indexPath.row];
[[segue destinationViewController] setDetailItem:album];
}

}

В этом м
ет
определит оде можно
ь
и когда до , какой путь
лжен испо
льзоваться.

186

глава 4

MasterViewController.m

Единственное
место, в котором нужно
внести изменения.

приложения с несколькими представлениями

тест-драйв
К этому моменту ваш код должен компилироваться и нормально работать.
Запустите приложение. Если выделить ячейку в главном представлении...

Обожаю
эту сцену!

Óëîâèëè?

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Пути предоставляют способ управления переходами между сценами.



Пути можно настраивать и активизировать вручную в коде.



По умолчанию обработка путей осуществляется в редакторе раскадровки.



На iPhone одна сцена соответствует
одному представлению. На iPad одно
представление может содержать несколько сцен.

дальше 

187

добавление записей

Я тут подумала... А что произойдет, когда мне понадобится
новая запись? Как изменить
информацию в таблице?

а

ниц

ощ
Пома
Роб

Сейчас добавлять новые записи
можно только одним способом —
прямо в коде.
Чтобы у приложения были тестовые данные, мы просто ввели их непосредственно в коде. Теперь нужно придумать более
удобный способ добавления записей. Для
данных, как и положено, определен отдельный класс, но сейчас пришло время
преобразовать данные в более удобную
форму. Такую, как список plist!

- (void)initializeDefaultAlbums {
[self addAlbumWithTitle:@”Infected Splinter” artist:@”Boppin’
Beavers” summary:@”Awesome album with a hint of Oak.” price:9.99f
locationInStore:@”Section F”];
[self addAlbumWithTitle:@”Hairy Eyeball” artist:@”Cyclops”
summary:@”A 20/20 retrospective on Classic Rock.” price:14.99f
locationInStore:@”Discount Rack”];
[self addAlbumWithTitle:@”Squish” artist:@”the Bugz”
summary:@”Not your average fly by night band.” price:8.99f
locationInStore:@”Section A”];
[self addAlbumWithTitle:@”Acid Fog” artist:@”Josh and
Chuck” summary:@”You should know this stuff.” price:11.99f
locationInStore:@”Section 9 3/4”];
}
данные сейПомните? Все
иксированы
ф
за
ко
час жест
м коде...
в программно

188

глава 4

AlbumDataController.m

приложения с несколькими представлениями

список
Äëÿ ýòîãî åñòü ïðèëîæåíèå

Сокращение Plist происходит от слов «property list» («список свойств»); эта форма представления данных
уже довольно давно существует в OS X. Более того, в нашем приложении уже используются несколько
списков plist. Мы уже работали с самым важным списком plist — файлом Info.plist вашего приложения.
Он строится средой Xcode при создании проекта, и кроме значков приложения в нем хранятся такие
сведения, как главный файл раскадровки, загружаемый при запуске приложения, версия приложения
и т. д. Xcode может создавать и редактировать такие списки plist, как и любые другие файлы. Чтобы
ознакомиться с содержимым списка, щелкните на файле SpinCity-Info.plist.

аметры
Многие пар
ожения,
ил
р
уровня п
сий, язык,
номера вер
значки...

Встроенный
e
редактор Xcod
кда
ре
т
упрощае
исков
сп
ие
ан
ов
ир
т
plist.

Цель уровня
приложения

часто

Задаваемые
вопросы

В:
О:

Откуда взялись списки plist?

Списки plist характерны для программирования Mac и iOS, хотя
сама концепция восходит к инфраструктурам NeXTSTEP и GNUstep.
Списки могут использоваться для хранения данных, относящихся
к типам Core Foundation: CFString, CFNumber, CFBoolean, CFDate,
CFData и CFDictionary. Редактор может преобразовать их в формат
XML или в двоичный формат.

В:
О:

Мы будем работать с XML в своем приложении?

Нет, мы воспользуемся инфраструктурами iOS для загрузки
списка plist (а также его разбора и т. д.). После загрузки данных мы
получим массив словарей, очень удобный для работы с данными
альбомов.

дальше 

189

создание plist

Ñîçäàéòå íîâûé ñïèñîê ñâîéñòâ
Все встроенные типы, которые использовались нами ранее (такие, как NSArray и NSString),
могут загружаться или сохраняться в списках plist автоматически через протокол NSCoding.
Мы можем воспользоваться этим обстоятельством и вынести тестовый список альбомов
из исходного кода в список plist.
1

Создайте пустой список plist.
Вернитесь в Xcode и откройте папку Supporting Files. Сделайте правый щелчок
на папке Supporting Files, выберите команду New file→Mac OS X Resource
и Property List. Присвойте новому списку имя AlbumArray.plist.

Списки plist ис
по
зуются в прог льраммировании не
только
для iOS, но и дл
я Mac,
однако включе
ны они
в эту категор
ию.

2

Преобразуйте список plist в массив.
Вернитесь в Xcode и откройте новый файл AlbumArray.plist.
В редакторе выберите в поле Type массив (Array).

Выберите
тип.

190

глава 4

приложения с несколькими представлениями

3

Поместите данные в список plist.
Так как мы собираемся извлечь из списка plist полную информацию
об альбомах, описания альбомов из кода следует переместить в файл
AlbumArray.plist.

роки
Четыре ст
о
сл
чи
и одно

Каждый
словарь
должен
содержать
пять элементов.

Нам потребуется
массив словарей.

дальше 

191

загрузка из plist

Ìû äîëæíû çàãðóçèòü êàæäûé àëüáîì èç ñïèñêà
При реализации кода A l b u m D a t a C o n t r o l l e r метод
initializeDefaultAlbums использовался для генерирования
массива с именем _albumList. Теперь мы переключимся на создание массива на базе списка plist. Это будет массив словарей...

Squish

Acid
Fog

AlbumArray.plist

192

глава 4

приложения с несколькими представлениями

Ïðåîáðàçîâàíèå äàííûõ â ñïèñîê plist îäíîé ïðîñòîé îïåðàöèåé
Так как инициализация данных выполняется методом initializeDefaultAlbums из файла
AlbumDetailController.m, достаточно привести этот метод к следующему виду:

- (void)initializeDefaultAlbums {
NSString *pathToAlbumsPlist = [[NSBundle mainBundle]
pathForResource:@”AlbumArray” ofType:@”plist”];
NSArray *defaultAlbumPlist = [NSArray arrayWithContentsOfFile:
pathToAlbumsPlist];
for (NSDictionary *albumInfo in defaultAlbumPlist) {
[self addAlbumWithTitle:albumInfo[@”title”]
artist:albumInfo[@”artist”] summary:albumInfo[@”summary”]
price:[albumInfo[@”price”] floatValue] locationInStore:albumInfo[@
”locationInStore”]];
}
}

AlbumDataController.m

дальше 

193

тест-драйв

тест-драйв
Запустите приложение и проверьте, как оно работает...

Роб в восторге!

194

глава 4

приложения с несколькими представлениями

Возьми в руку карандаш
Какие из следующих утверждений о списках plist истинны?
И почему их стоит использовать в программах?

Это простой способ организации хранения данных, хорошо подходящий
в начале работы над программой.

Списки plist не поддерживают более
сложные типы данных — только строки.

Это структура базы данных.

Списки plist хранятся в формате XML.

дальше 

195

решение упражнения

Кто и что делает?
ае
ае
решение
Соедините каждый контроллер с описанием того, что он делает.

Контроллер

Что делает
Предоставляет стек навигации для переходов
между представлениями; встраивает панель навигации в верхней части представления.

UIViewController

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

UINavitgationController

UITableViewController

Контроллер включает основные средства, необходимые для работы с представлениями.
UITabbarController

Предоставляет системный интерфейс для редактирования видеоданных прямо на устройстве.

UIPageViewController

Встраивает табличное представление в используемое представление. Может использоваться
для детализированных представлений или более
традиционного табличного представления.

UIVideoEditorController

Контроллер используется для обработки перемещений между контроллерами представлений
с заданным переходом.

Возьми в руку карандаш
Решение

Какие из следующих утверждений о списках plist истинны?
И почему их стоит использовать в программах?

Это простой способ организации хранения данных, хорошо подходящий в начале
работы над программой.
Это структура базы данных.

196

глава 4

Списки plist не поддерживают более сложные типы данных — только строки.
Списки plist хранятся в формате XML.

собой файлы XML.
Списки plist представляют
х данных, но самым
база
о
рим
ово
пог
Позднее мы
ся SQLite.
яет
явл
простым вариантом

приложения с несколькими представлениями

ГЛАВА 4

Âàø èíñòðóìåíòàðèé ïðåäñòàâëåíèé
Глава 4 осталась позади, а ваш инструментарий
пополнился приложениями с несколькими
представлениями.

Пути
 Представляют переходы
между сценами.

ения
ставл
д
е
р
п
и
ные
йку, пр
Таблич
астро одить
ают н
х

 В приложениях iPad одно
представление обычно
состоит из двух сцен.

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

случае в зависимост
в том
я
с
ь
т
я
ен
ны изм х.
ны
н
а
ичных
д
от
и табл ся
к
й
е
ч
я
ские
уют
атиче
спольз
ек
 Ст тавлений и
ет яче
к
а
м
с
.
и
д
е
л
с
ы
р
е
н
п
,
ян м
случае
посто
в том ставаться
о
должен



Могут настраиваться
в программном коде.

Списки plist


Хорошо подходят для
представления массивов
и словарей чисел и строк.

 Поддерживают хранение
только строк и числовых
данных.

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Пути предоставляют способ управления переходами между сценами.



Пути можно настраивать и активизировать вручную в коде.



По умолчанию обработка путей
осуществляется в редакторе раскадровки.



На iPhone одна сцена соответствует одному представлению. На iPad
одно представление может содержать несколько сцен.

дальше 

197

5 Процесс рецензирования, дизайн и устройства

Как жить в «яблочном» мире
Мама говорит, что если
я не буду есть по яблоку
каждый день, от меня отвернутся все друзья и знакомые.
Надо почистить и нарезать
дольками!

Разработка iOS не ограничивается одним программированием.
Наверняка вы уже слышали всевозможные ужасы. Процесс рецензирования
Apple известен своей строгостью и обилием правил, которые должны соблюдать
программисты. Да, не ждите, что все пойдет как по маслу, но если вы знаете,
что делаете, — все отнюдь не так плохо. А кроме того, когда ваше приложение
будет одобрено, перед вами откроется неимоверно популярный магазин App
Store... с множеством покупателей, готовых расстаться со своими долларами.
Разве не заманчиво?

приложения — это просто

Запустить Xcode. Загрузить проект
из Git. Перетащить несколько
элементов, написать немного кода
Objective-C... Звучит так просто.
Нет, правда, слишком просто...

Да, написать приложение несложно — когда
вы знаете, что делаете. Но чтобы ваше
приложение продавалось в App Store, одним
программированием дело не ограничится.
Магазин App Store — это мир Apple. Эта компания устанавливает правила игры, и очень серьезно относится
к своим обязанностям владельца магазина (а также
производителя ваших устройств и программного обеспечения).
Если вы начнете заниматься разработкой приложений
iOS, до вас неминуемо начнут долетать слухи. Некое
замечательное приложение было трижды или четырежды отвергнуто в процессе рецензирования, а тем временем у приложений Facebook и Apple Trailers вышло
четыре новые версии. Вроде бы сущая мелочь — URL
в описании, плохо выбранное имя — и приложение
отклоняется.
Да, ваше приложение должно быть одобрено рецензентами Apple. И оно действительно может быть отклонено
по многим причинам. Но... отказы чаще всего связаны с
мелочами, которые легко исправить. И если вы знаете,
что делаете, вам удастся легко избежать долгого ожидания и дорогостоящей переработки.

200

глава 5

процесс рецензирования и дизайн

Ýòî ìèð Apple... ïðîñòî âû â íåì æèâåòå
Между разработкой для iOS и разработкой для Android (а также для большинства
других платформ) существует принципиальное отличие: App Store — жестко управляемое сообщество. Это означает, что Apple имеет исключительное право принимать или отклонять приложения в своем магазине на основании определенных
критериев. Тем самым гарантируется единство стиля и некоторая степень качества.
У Apple действует система цензуры, так что непристойные или излишне жестокие
приложения не принимаются.
Итак, если вы хотите работать в пространстве iOS, можете считать этот процесс
частью своей жизни. В процессе разработки могут происходить события, вам
неподконтрольные, а иногда плохо прогнозируемые — например, выход новой версии iOS и ее последствия для ваших приложений. Скажем, iOS 7 внесла ряд принципиальных изменений в дизайн приложений, и внезапно «новый пользовательский
интерфейс» оказался на первых позициях в списке текущих задач разработчиков.
Процедура рецензирования продолжается от недели до месяца, а отказ обычно
означает повторную отправку и полное прохождение
всей процедуры.
Вам также придется изучить ряд документов, которые выходят за рамки написания кода приложений.
Прежде все это...
понимае-

Нравится вам
это или нет

правила опреде
ляет Apple. К
ак
бы вы к этом
у
ни относились

как к стремле
нию к созданию
лучшего, более
безопасного
устройства,
или же к попы
тке тотальног
о
контроля, —
в мире iOS пр
идется жить по
правилам Appl
e.

Если вы
вана
App Store...
ple организо
p
A
о
те, как у
эт
,
ий
ен
ож
ил
продажа пр ает.
ощ
многое упр

Human Interface Guide
lines (HIG).
Apple хочет, чтобы ваш
и приложения работали опр
еделенным образом... И эти
правила
луч
лу
учш
ше
е не нарушать.

и по проРекомендаци ию для iOS —
ан
граммиров ути Apple»,
«п
изложение
акже должен
который т
».
шим путем
стать «ва

дальше 

201

отказы крупным планом

Отказы Apple
под увеличительным стеклом

Мы не приводим те
кс
зов — Apple не разр т реальных откаешает это делать
.
Тем не менее таки
е ситуации типичн
ы,
а отказы по таки
м причинам встре
чаются сплошь и ря
дом.

Интересно узнать типичные причины отказа? Вот несколько примеров.
Прочитайте внимательно! В большинстве случаев вы быстро поймете,
как избежать такой неприятной ситуации.

To: Разработчик Дин
From: Рецензенты Apple
Subject: Отказ по приложению
деМы проверили ваше приложение и опре
ые
тор
неко
тся
шаю
лили, что в нем нару
рекомендации.
ме«Приложения со ссылками на внешние
или
а
ханизмы приобретения контент
веподписки — например, кнопка “Купить”,
элек
дущая на веб-сайт для приобретения
.
ься»
тронной книги, — будут отклонят

Apple крайне жест
ко контролирует ссылки на
внешние
сайты в приложен
иях. Если
эти сайты продаю
т какой-либо цифровой
контент:
книги, музыку, фи
льмы, что
угодно — ваше прил
ожение
не пройдет реценз
ирование.
И не думайте, чт
о у рецензентов Apple не
хватит
времени на провер
ку каждой
ссылки. Они фанати
чно следят за тем, чтоб
ы покупка
цифрового контен
та в приложениях осущест
влялась
только через меха
низм In App
Purchase магазина
App Store.

To: Компания «И так сойдет»
ют
приложения работа
В наши дни многие
это
ли
Ес
d.
iPa
на
и
к
как на iPhone, та
для
му приложению, то
относится к ваше
но
лж
ирования оно до
прохождения реценз
нов
я разрешений экра
дл
ки
ач
зн
ь
содержат
аст
а также предо
разных устройств,
s
ражаемую в iTune
об
от
у,
ик
вить граф
и App Store.
ндации iOS Human
К счастью, рекоме
о
(см. далее) предельн
Interface Guidelines
должны
ы
рс
су
ре
е
ки
ка
четко объясняют,
те
ожение. Прочитай
включаться в прил
у для
ик
аф
гр
е
ит
ож
ил
рекомендации и пр
. Все просто!
нужных разрешений

202

глава 5

From: Рецензенты Apple
Subject: Отказ по приложению
«Мы проверили ваше приложение и
определили, что в нем не хватает знач
ков для
других разрешений экрана».

процесс рецензирования и дизайн

Отказы Apple под увеличительным стеклом

To

арье»
: Компания «Долой ст

ple
From: Рецензенты Ap
иложению
Subject: Отказ по пр

приложение и опре«Мы проверили ваше
проходит проверку
делили, что оно не
Ваше приложение
работоспособности.
».
не работает в iOS 4.0

Старые телефоны
уже не актуальны, верно? Нет,
неверно! Apple
позволяет указат
ь, какие версии
iOS вы поддержива
ете, но если
какая-то версия за
явлена — Apple
проследит за тем,
что она ДЕЙСТВИТЕЛЬНО подд
ерживается.
Что это означает
для вас? Тестирование на все
х ус
на которых должно тройствах,
ра
приложение... Без ис ботать ваше
ключений!

To: Компания «Перед

овые разработки»

From: Рецензенты Ap

ple

х и iPad с гигантДаже на телефона
ти 64 Гбайт коммя
па
ским объемом
о следит за тем,
пания Apple серьезн ие вело себя разен
ож
ил
чтобы ваше пр
эгоистично. Хотя
м
ко
иш
сл
не
и
умно
от счет нет,
эт
на
ил
писаных прав
зовать только ту
старайтесь исполь
м действительно
ва
я
ра
память, кото
необходима.
рованный пользоваКонтент, сгенери
млем, но если ваше
ие
пр
но
телем, обыч
м
ает большой объе
приложение загруж
без
но
ен
об
пуске (ос
информации при за
еля) — берегитесь.
ат
зов
ль
по
я
ти
учас
отказ...
Возможно, вас ждет

Subject: Отказ по пр

иложению

«Мы проверили ваше
приложение и опреде
лили, что оно загруж
ает слишком большо
й
объем контента. Пр
иложения ограничива
ются по объему ресу
рсов, которые могу
т
потребляться при ис
ходной загрузке».

дальше 

203

упражнение

Упражнение

Мы привели лишь несколько примеров, но возможно, вы уже представляете себе основные
причины, по которым Apple может отклонить ваше приложение. На основании того, что вы
узнали, попробуйте определить, почему приведенное ниже приложение почти наверняка
будет отклонено в процессе рецензирования.
А если уж вы совсем жестоки, предложите не одну, а целых три причины, по которым
Apple покажет этому приложению «красную карточку».

204

глава 5

процесс рецензирования и дизайн

часто

Задаваемые
вопросы

В:
О:

Нечестно! Это тоталитаризм!!

Да, иногда все выглядит именно так.
Но весь этот процесс — плата за то, что вы
увидите свое приложение на устройстве iOS.
Иного пути просто нет. И конечно, награда
того стоит: магазин App Store по заработкам
существенно опережает своих конкурентов
и поэтому является лучшим местом для
продажи приложений!

В:

Могу ли я определить, не будет ли
мое приложение отклонено, до отправки
на рецензирование?

О:

Нет, не можете — по крайней мере
не на 100%. Лучшее, что вы можете сделать, — тщательно ознакомиться с правилами рецензирования App Store перед
тем, как браться за программирование. (Да,
именно перед тем!) Если в приложении
присутствует какая-либо неоднозначная
функциональность, попробуйте поискать
в App Store другие приложения с аналогичными потенциальными проблемами.
Если такие приложения прошли рецензирование, вероятно, их создатели както справились с вашими трудностями.
И все же ничего нельзя сказать с уверенностью до того, как ваше приложение отправится на рецензирование. На практике
это означает, что вы должны включить в
график как минимум один отказ и повторную отправку! Если возникнут какие-то непредвиденные обстоятельства, по крайней
мере бизнес-график не будет безнадежно
испорчен!

В:

Они отклонили мое приложение!
Как мне его отправить повторно?

О:

Это зависит от причины отказа. Если
из-за мелких проблем в метаданных — иногда удается вернуться в начало очереди; это
лучший вариант.
К сожалению, большинство отказов сопряжено с изменениями в коде, выходящими
за рамки метаданных. Это означает, что
вам придется заново отправить все приложение... И пройти весь процесс рецензирования заново.

В:
О:

Можно ли опротестовать отказ?

Конечно! Когда ваше приложение отклоняется, всегда можно подать апелляцию.
Однако рассмотрение апелляций занимает
много времени, так что подавайте их, только
если вы действительно уверены в
своей правоте. В противном случае все
кончится потерями времени на апелляцию
и на повторную отправку.

В:

В:

Но некоторые требования просто
нелепы! Я не могу использовать ссылки
на внешние сайты? А на свой собственный сайт?

О:

Вообще-то запрещены не все внешние
ссылки... но многие. Проблема с внешними
ссылками заключается в том, что если существует путь навигации с внешнего сайта
на какую-нибудь платежную систему, Apple,
скорее всего, отклонит ваше приложение.
Даже если вы не хотели ничего плохого,
Apple рассматривает это как попытку обойти
свой механизм оплаты (In App Purchase
или IAP) — а к подавлению таких попыток
в Apple относятся очень серьезно.
Что еще хуже, внешние ссылки могут отрицательно повлиять на рейтинг вашего
приложения. Игре для детей, которая могла
бы стать хитом в младших классах, вдруг
присваивается взрослый рейтинг — из-за
контента в трех страницах от той, на которую ведет ваша ссылка. Да, у нас такое
случалось... Будьте очень, очень осторожны
при использовании внешних ссылок.

Как все это можно планировать?
Полный хаос...

О:

Да, строить графики в такой ситуации
непросто. Но с этим все равно ничего не
поделаешь. Опытные разработчики часто
отводят на процесс отправки (и повторной
отправки) не менее месяца.

дальше 

205

решение упражнения

Отказ... Какое неприятное слово! Будем надеяться, что вы нашли хотя бы пару причин,
по которым это приложение может быть отклонено. Обязательно разберитесь, что здесь
недопустимо с точки зрения Apple. Чем лучше вы будете видеть происходящее «глазами
Apple», тем реже вы будете получать сообщения с отказами.
тся
но относи
pple серь ез не сомнеA
е,
ет
а
м
Как вы ду варным знакам? И отправить
о
ь
ad
к своим т аже не пытайтес
iPhone и iP Д
.
ва
ь
о
ес
сл
т
м
и
о
р
вай
ег
о
р
т
о
м
ие, в к
еверны
приложен ошибками или с н
с
записаны волов.
м
стром си

iPhone

Внешняя ссыл
ка,
в которой пр
едлагается офор
мить подписку
в Интернете?
Будьте уверен
ы
Apple не остав —
ит
ее без внимания
.

206

глава 5

Заодно уда
лите все л
оготипы
Apple... ил
и все, что
можно
принять за
Если вы эт логотип Apple.
ого не сдел
это тоже
а
может ст ете,
причиной
а
ть
отказа.
Компании
A
когда стор pple не нравится,
онние прил
пытаются
ожения
ее популяр воспользоваться
ностью, п
оэтому
к таким ве
щам рецен
тоже отн
зенты
осятся сер
ь езно.

6!
к в iOS
ит ка ь
д
я
л
г
ы
В
т
та час тать
Если э
бо
а
р
т
е
не буд — значит,
в iOS 7 повезло.
вам не

процесс рецензирования и дизайн

Ïðîâåðêà óñòðîéñòâà — îáÿçàòåëüíàÿ ÷àñòü
Первая модель iPod вышла в 2001 году, а первая модель iPhone — в 2007-м. В техническом отношении эти
устройства разделяют около 32 000 лет. И хотя Apple активно содействует обновлению ОС, обновление
старых устройств с какого-то момента становится невозможным. Это означает, что вы должны решить,
какие версии ОС, а следовательно, какие устройства, будет поддерживать приложение.
Еще важнее другой вопрос — что это будет означать для старых устройств, которые не могут быть обновлены до поддерживаемой вами версии iOS? Старые устройства могут поддерживать или не поддерживать
камеру, запись видео, внутренние динамики, GPS... И это только начало!
Корректная обработка* подобных ситуаций получила название «проверка устройства» (device checking).
Вы должны использовать этот процесс, чтобы гарантировать нормальное поведение всех устройств, на
которых может запускаться ваше приложение — даже если они не обладают программными или аппаратными возможностями, которые могут использоваться вашим приложением.
ет
е мож
ложени е эти
и
р
п
е
ь вс
Ваш
живат
поддер ства...
й
устро

...но ни одно из
этих
устройств. За
это
отвечаете вы
!

Даже в
треть плеерах
е
колени го поя iPod
н
было к
амеры. е

а» —
аботк ыражения
р
б
о
я
а
к».
ректн
а для в
*«Кор учная замен d в булыжни
в
a
з
iP
о
г
ть
бла
евраща
«не пр

епланш
ления ры... весьма
о
к
о
п
ме
ого
У перв d не было ка ие. А iOS 7
ч
a
и
iP
л
в
т
о
рые
о
т
енное
на ста сив
я
т
с
с
е
т
е
о
а
в
н
сущ
и
т
л
на о
анав
не уст ства и даже iPod Touch.
и
й
л
о
е
р
д
о
уст
ем
о новы
тельн

Так как же работает проверка устройств?
дальше 

207

проверка устройства для камеры

Ïðèìåð ïðîâåðêè óñòðîéñòâà: êàìåðà
Как работает проверка устройства? Предположим, вашему приложению
нужно, чтобы устройство поддерживало камеру. Но как только у приложения возникает необходимость в каком-то конкретном устройстве,
приходится учитывать новые дополнительные требования.
Любое приложение, написанное для iPhone, также должно работать
на iPod и на iPad. Это означает, что при использовании функций, присутствующих только на части поддерживаемых устройств — например,
камеры, необходимо проверять их доступность... и обрабатывать ситуации, в которых нужное устройство недоступно.
Итак, возьмем камеру: класс UIImagePickerController содержит
метод для проверки камеры.

Да, вы м
ож
в описани ете указать
и
iPad», но «только для
л
живать вс учше поддере устрой
ства
(iPad, iPo
d, iTouch,
iНовинка2015),
и
версию iO спользующие
S, для кот
предназна
орой
ч
ложение. ено ваше при-

[UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]
источником данных
Камера является
ная команда прове(source); приведен
д
ик доступен... пере
ряет, что источн
льзовать.
тем, как его испо

iOS áåðåò íà ñåáÿ òåõíè÷åñêèå ïîäðîáíîñòè
Система iOS достаточно умна для определения функций, поддерживаемых конкретным устройством. Таким образом, запросив у UIImagePickerController
типы источников данных, вы сможете решить, какие варианты следует предложить пользователю.
дит
Так выгля
ер,
л
л
о
р
конт
,
м
и
ст
у
п
до
ед
сл
на по
и
ней модел
.
5
e
iPhon

ре, сделать
Обратиться к каме
м вернуться и
те
за
фотографию, а
изображение в пепоместить новое
даете управление
ре
ременную. Вы пе
erControllerSourceTy
классу UIImagePick
все остальное.
ет
peCamera, он дела
Перейти к
библиотеке
фотографий
выбрать из
,
ображение,
вернуться и
сохранить ег
о в перемен
ной. Здесь вс
работу выпо
ю
лн
ControllerSou яет класс UIImagePicke
rceTypePhoto
r
Library.

к исходному
Просто вернуться
оятно, нековер

представлению
и ImageView.
торой разновидност

208

глава 5

процесс рецензирования и дизайн

Õìì... óñòðîéñòâî ïîääåðæèâàåòñÿ, ôóíêöèÿ íåäîñòóïíà
Итак, проверка таких источников данных, как камера, обязательно. Но даже если вы проверяете наличие источника, это не означает, что на устройстве действительно присутствует этот
источник. Помните iPod третьего поколения?

новая
ельно орую,
т
и
с
о
Отн
, кот подь iPod
модел но, стоит ней
а
вероят ать... Но н
в
и
ж
р
.
де
амеры
нет к

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

полуИтак, вой
о
н
чение
афии
р
г
о
т
фо
их iPod
г
о
на мн
d
ых iPa
и стар тает...
о
не раб

...Но в
ы
щей ф бор сущес
т
може отографи вуюи
т
вашим поддержи вполне
в
и ста приложен аться
и
р
вами ыми устр ем —
польз
овате ойстлей.

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

дальше 

209

знакомьтесь: HIG

Значит, Apple следит за тем, чтобы мое
приложение работало на их устройствах. Хорошо хоть, что они не заставляют меня
использовать конкретный дизайн, чтобы мое
приложение выглядело «стандартно».

Вообще-то... они следят и за этим.
Знакомьтесь: Human Interface Guidelines.
Вероятно, вы уже заметили, что все приложения на устройствах iOS (кроме игр)
используют сходный дизайн и схемы взаимодействия с пользователем. Так создается
фирменный «стиль» приложений iOS, благодаря которому пользователю становится проще освоить новое приложение. Это
называется «стандартом минимальной доступности»: пользователь уверен в том, что
он относительно легко освоит почти любое
приложение, потому что он уже работал с
другими приложениями, которые выглядят
и работают похожим образом.
Все эти взаимодействия подробно описаны в
документе Human Interface Guidelines. Это
еще один документ с портала Developer Portal,
описывающий процесс работы пользователя
с приложением.

равила
В iOS 7 п я и повеи
оформлен жений
о
л
и
р
п
дения
ественщ
су
и
л
бы
ботано перера ерсия
в
ны. Новая ет вам
ж
о
м
о
HIG п
на новые
перейти
S 7.
правила iO

Вас раздражают требования к дизайну
приложений? Это нормально... Многие
чувствуют то же самое — до того, как
хорошенько подумают.
210

глава 5

процесс рецензирования и дизайн

Ïðàâèëà HIG ïîìîãàþò, à íå ìåøàþò
Документ HIG полон правил, которые упрощают вашу работу. Это длинный документ, но его
определенно стоит прочитать, чтобы позднее вы могли обращаться к нему время от времени, чтобы освежить память. В HIG рассматривается практически все, от рекомендаций по
дизайну до использования значков. Вы узнаете, как спроектировать приложения «в стиле»
стандартных приложений Mac — таких, как Почта...
зовали панель
Вы уже исполь ожениях
ил
пр
в
навигации
здесь испольА
...
ne
ho
iP
для
ллер раздеро
нт
зуется ко
авления iPad.
ленного предст

Хотите знать,
какую высоту
должныиметь
эти панели?
Загляните в HIG.

о
должн
Что ться
и
наход хней
на в ер состои
панел агляЗ
яния? HIG.
в
е
т
ни

даже знач
Описаны
ж
л
до
е
ы
ки, котор ься на
т
ны находи распох
и
,
х
я
ел
н
а
п
размеры.
и
е
и
ложен

Включение
временного текста
в поле поиска
и других
текстовых
полях также
оговорено
в HIG... с подробностями.

ся в этом
изации остает ление фиксиПанель детал
ав
ст
ед
личное пр
чиваются
месте, а таб
панели прокру
бе
О
ь.
ес
зд
ся
от дизайн
рует
уг от друга. Эт
независимо др многих приложениях iOS!
во
встречается

дальше 

211

iOS и HIG

Âû óæå ïîíåìíîãó ïðèâûêàåòå ê ïðàâèëàì HIG...
А может, во время чтения вам покажется, что в HIG всего лишь документируется то, к чему вы уже привыкли... И будете правы! Каждый раз, когда вы
используете такое приложение, как Почта, ваши глаза (и пальцы) привыкают
работать с приложением, спроектированным по правилам HIG.
какие элеВ HIG указано, ия можно
ен
менты управл верхней
на
разместить
использопанели и как их ваше прино
ап
ез
вать... Вн
ет выглядеть
ложение начина льзователя.
я по
«знакомо» дл
о!
ш
ро
хо
о
эт
И

Другой пример — приложение iTunes...

ный
Сегментирован
ения...
вл
ра
элемент уп
алире
т
ае
ог
м
HIG по
ороф
ь
ил
зовать ст
т
ве
от
со
я,
млени
илю
ствующий ст ий.
ен
ож
ил
пр
их
друг

лер панеКонтрол , другой
к
ли закладо ый элемент
н
т
р
да
нстан
я. А «ста
и
ен
вл
а
р
п
,
у
ет
а
ч
а
озн
дартный» элемент
что этот да ведет
ег
почти вс ово... Это
ак
н
ди
о
бя
се
коспект, в еа
т
о
не т
ж
о
л
ше при
тором ва блеснуть
ние может стью.
но
оригиналь

212

глава 5

В HIG содержит
много информ ся
ац
о том, как ис ии
пользовать панели вк
ладок,
как организова
ть навигацию и каки
е
ки можно испо значльзовать... Все эт
о си
упрощает рабо льно
т
дизайнера прил у
ожения.

часто

В:
О:

Задаваемые
вопросы
Понятно... Но ведь есть приложения, для которых правила HIG не нужны?

Вообще-то нет. Есть приложения, для которых правила HIG менее актуальны...
как, например, игры, в которых вся графика создается дизайнером. Но даже в этом
случае HIG помогает спроектировать естественные взаимодействия «в стиле iOS».
И это очень важно...

процесс рецензирования и дизайн

Выходит, все ради того, чтобы
не отставать от Apple и iOS 7,
верно? «Новый стиль приложений
iPhone»?

Нет. Правила HIG имеют отношение
к проектированию приложений,
но не ограничиваются визуальным
дизайном.
Информационная архитектура — один из
важных факторов проектирования приложений, с которыми будут работать живые
люди. Версия iOS7 значительно изменила
оформление и поведение iOS, но также ее
выход был отмечен функциональными перемещениями. В iOS появился Центр управ, ления, который можно в любой момент
lay
rP
Ai
h,
ot
to
ue
Bl
вызвать от нижнего края экрана, а также
обмен сообщениями по разным
и, ряд других усовершенствований.
тям — функци
се
которые исполь
их
ог
мн
во
зуются
приложениях.

дальше 

213

дизайн не сводится к внешнему виду

е-что.
...и еще ко

Äèçàéí = âíåøíèé âèä + ïîâåäåíèå
Более тонкие шрифты и повышение разрешения экрана в процессе становления
экосистемы iOS означают, что новая версия iOS начинает использовать дополнительное место для вывода более подробной информации.

Обратите
а
внимание на
»
ие
ск
ло
«п
значки.

Нижняя панель предназначена
для размещения значков часто
используемых приложений...
Она была создана не по соображениям дизайна.

ет
ядит и вед
iPad выгл потому что
е,
себя инач
ользуетах исп ейс.
на планш
ер
й инт ф
ется друго
фейса
Для интер ерны
т
к
а
р
а
iPad х
емые пред
сворачива и упроя
ставлени
вигация.
а
н
я
а
н
ен
щ

Хороший дизайн
не сводится
к внешнему виду
приложения.
ставлений,
Несколько пред орых
т
ко
интерфейсы
йствиями
де
ся
т
яю
управл
я.
пользовател

214

глава 5

процесс рецензирования и дизайн

Ïÿòü ãëàâíûõ îòëè÷èé iOS 7
1

Более плоский дизайн.
В веб-дизайне и в iOS проявляется тенденция к переходу на плоский
дизайн. Отбрасываемые тени и синие подчеркнутые ссылки старого
Интернета постепенно исчезают. Теперь устройства и веб-страницы не
используют тени и не пытаются имитировать визуальную глубину.

2

Скевоморфизм остался в прошлом. Капитально.
В iOS 6 компания Apple рекомендовала разработчикам имитировать
в интерфейсах реальные объекты. Предполагалось, что умение работать
с меню или календарем поможет пользователю в работе с устройством
iOS. В iOS 7 приложения стали более похожими на разных устройствах,
потому что они в полной мере используют свою цифровую природу.

3

Унификация взаимодействий на разных устройствах.
iPad и iPhone отличаются друг от друга, и мы еще поговорим о том, как
эффективно использовать особенности каждого устройства. Но в iOS 7
компания Apple начала масштабное наступление на унификацию взаимодействий между iPhone и iPad.

4

Стратегическое использование цветов.
В приложениях iOS интерактивные элементы выделяются цветом (вместо
теней и кнопок), так что старомодные подчеркнутые ссылки остались
в прошлом. Вместо этого текст, с которым можно взаимодействовать,
т возникотличается от статического текста цветом.
ников могунекоторыми
У дальто
с
и

5

удност
нуть тр заранее проанализи
.
;
ы
и
м
ем
а
бл
т
о
цве
пр
зможные
руйте во

iOS создает ощущение глубины.
Использование параллакса в iOS 7 в сочетании с датчиками устройства
создает иллюзию визуальной глубины за значками приложений. Кроме
того, из-за эффекта полупрозрачности в приложениях пользователь
видит, как представление «скользит» под навигационными элементами
приложения; так создается иллюзия визуальной многослойности.

дальше 

215

смартфоны и планшеты

Èíôîðìàöèÿ ê ðàçìûøëåíèþ: iPad — íå iPhone
До настоящего момента мы не задумывались над тем, будет ли приложение
Проблема не
выполняться на iPhone или iPad — код для обоих устройств был одинаковым. ся простым решаетувел
Однако отличия существуют: помимо размера экрана, iPad всегда поддерживает чением изображениий
изменение ориентации, тогда как многие приложения для iPhone работают и шрифтов для iPad.
Во-первых,
приложетолько в вертикальном (книжном) режиме. Другим важным фактором явля- ние
будет хуже
выется продолжительность работы с устройством. Приложения iPhone проек- глядеть,
а во-вторы
х,
тируются для быстрого, простого доступа к информации. Пользователи iPad Apple может
отклони
т
ь
обычно работают с устройством в течение более продолжительных периодов
его.
времени, а их взаимодействия отличаются большим уровнем интерактивности.
В общем, вам придется по-разному относиться к этим устройствам.

Различия между устройствами...
Под увеличительным стеклом
Посмотрите, как выглядит Календарь на каждом устройстве.
Подумайте над тем, какие решения были приняты Apple... Вам
придется принимать похожие решения в своих приложениях!
В iPad исполь
зуется
полноэкранное
представление. Пр
иложение напомин
ает
настенный ка
лендарь.

.

iPad..

iPhone

Внизу расположены
важные
кнопки,
часто используемые
в приложении.

216

глава 5

HIG рекоменду
ет эффективно исполь
зовать экранн
ое
пространство
в приложениях для iPad —
ли
заполняется до шнее место
полнительной
информацией.

Из-за ограниченной площади экрана
выводится
меньшее количество
информации,
но общая
схема навигации остается
неизменной.

процесс рецензирования и дизайн

Различия между устройствами...
Под увеличительным стеклом
Версии Safari на iPhone и iPad очень похожи. Некоторые средства управления
могут размещаться сверху или снизу, но в целом взаимодействия проходят одинаково. Впрочем, один аспект навигации отличается принципиально...
ки,
я вклад
ьзуютс ртативл
о
п
с
и
На iPad ерфейсах по
нт
как в и ьютеров.
п
м
о
к
х
ы
н
На iPhone кнопка «+»
открывает трехмерную галерею
открытых сайтов.

Очень важно своевременно понять, что ваш
интерфейс просто не подходит для маленького экрана. Работать со вкладками на экране
смартфона неудобно, поэтому было выбрано
другое решение.

Довольно о iPad/iPhone…
Чем iOS отличается от Android?
дальше 

217

беседа у камина

Беседа у камина
Ñåãîäíÿ â ñòóäèè: êàêîâî ýòî — ðàçðàáàòûâàòü
ïðèëîæåíèÿ äëÿ äðóãèõ óñòðîéñòâ?

Ðàçðàáîò÷èê Apple:
Привет. Мы вроде бы разобрались с тем, каково живется в моем мире с Apple. Интересен
свежий взгляд со стороны.

Да, есть и руководство по программированию.
В нем содержится много информации о новшествах в Objective-C, о стандартных взаимодействиях с пользователем и программных
решениях, которые следует применять... и все
такое. А на каком языке пишутся приложения
Android?

Что значит — «не обязаны»? Разве ваши приложения не должны рецензироваться, чтобы
попасть в магазин App Store?

Выходит... ваши приложения могут вытворять
все, что захочет разработчик? Я слышал про
жалобы пользователей на подозрительное
поведение приложений Android...

Погоди, ты изменяешь базовое поведение
устройства? А кто следит за тем, чтобы код
работал на всех телефонах и планшетах на
базе Android?
218

глава 5

Ðàçðàáîò÷èê Android:

Похоже, разработчикам iOS приходится выполнять множество правил. HIG, процесс
рецензирования... да еще и руководство по
программированию впридачу?

Все приложения Android пишутся на Java.
И у нас есть много справочной информации,
причем бесплатной, но мы не обязаны использовать все это, если не хотим!

Какой магазин? У нас их несколько, а не один,
как у вас в iOS. Есть Google Play, есть Amazon
Appstore... и наверное, будет еще больше.
И никакие одобрения не нужны. Приложение просто попадает в магазин, и все. Как
тебе такое?

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

Вообще-то никто... Но на моем телефоне
и двух планшетах все работает!

процесс рецензирования и дизайн

Ðàçðàáîò÷èê Apple:

Ðàçðàáîò÷èê Android:

Да, но ведь разных устройств Android... миллион, не
меньше!

Разве не здорово? Такой огромный выбор!
А что у вас — три размера? Да у нас на порядок
больше! И мы используем каждое устройство
так, как хотим. Я строю свое приложение так,
как считаю нужным!

Эээ... да. Значит, ты можешь написать приложение,
которое работает только на твоем телефоне и на твоем планшете? Может, процесс рецензирования Apple
и выглядит странно, но зато от моих приложений
устройство не впадает в кому...

Да, бывает и такое, ну и что? Я выпускаю обновление. И не надо ждать, пока какая-то дурацкая команда что-то одобрит!

Конечно. Замечательно. То есть ты можешь очень
быстро выпустить свое дефектное приложение? Вот
пользователи обрадуются!

Сильная сторона Android — гибкость. И ты
не лезь к нам со своим разъемом Lightning,
понял?

Зато я уверен в том, что то, что работает у меня, будет
работать и у всех остальных, фанатик Android!
Лемминг!
Анархист!
Наплевать. Ты просто... постой, мне надо бежать, снова сообщают об ошибке. Нужно выпускать версию 324...

До встречи... А я пока проверю свои продажи в App
Store...

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Если вы хотите создать хорошее приложение,
важно соблюдать правила Human Interface
Guidelines (HIG).



Запланируйте время на проверку, рассчитывая
на то, что в результате выпущенное приложение будет содержать меньше ошибок.



Частичная потеря гибкости дизайна компенсируется тем, что даже незнакомые приложения
выглядят привычно.



Apple жестко контролирует свои приложения.
Нравится вам это или нет — таков путь iOS
со всеми его достоинствами и недостатками.
дальше 

219

не бывает глупых вопросов

часто

Задаваемые
вопросы

В:

Как правила HIG изменялись со временем?

О:

С течением времени правила HIG
становились более гибкими. В App Store
появлялось все больше приложений, технические новшества открывали возможность
для новых типов взаимодействий, а компания Apple пропускала эти новшества и брала
их на вооружение.
Например, во многих приложениях используется элемент управления, который
«выдвигается» сбоку и частично закрывает главный экран (в частности, он широко
используется в Facebook). Этот элемент
управления нигде не описан в HIG, но он
уже может считаться вполне стандартным
для приложений iOS.

В:

Не приведет ли соблюдение HIG
к потере индивидуальности моих приложений?

О:

Да и нет. HIG существует для того, чтобы взаимодействия с вашим приложением
походили на взаимодействия с другими
приложениями, чтобы упростить задачу
пользователя. Однако творческий подход —
замечательная штука, и новые пользовательские интерфейсы помогают выделиться
на фоне конкурентов. Ваш дизайн может
быть оригинальным и без нарушения HIG
и стандартных схем взаимодействий iOS.

В:

А если я пишу игру? Какие правила
действуют в этом случае?

О:

Как только вы отходите от использования стандартных элементов управления,
вы начинаете отходить от HIG. Когда у вас
появится некоторый опыт разработки iOS,
вы начнете представлять, когда следует
заботиться о HIG (например, разместить
настройки приложения в пакете настроек),
а когда можно идти по полностью нестандартному пути.

В:

Как насчет естественных пользовательских интерфейсов? Это еще актуально?

О:

Когда-то было очень актуально. На
первых порах компания Apple очень настойчиво продвигала идею имитации интерфейсов из реального мира в приложениях
(особенно для iPad). Отличным примером
служит приложение Календарь — неровные
страницы и знакомый дизайн настенного
календаря выглядят «как настоящие». Однако по мере становления платформы iOS
приложения начали постепенно отходить
от этой идеи.

Ваш дизайн может быть оригинальным
и без нарушения HIG и стандартных схем
взаимодействий iOS.
220

глава 5

В:

Так разработчикам Android не приходится получать «добро» на распространение своих приложений?

О:

Нет. Android — платформа с открытым кодом, и это сообщество не подразумевает «сторожа», добавляющего лишний уровень утверждения приложений.
Впрочем, это не значит, что никаких правил
нет вообще. Большинство успешных приложений Android добровольно соблюдает
рекомендации. Для Android существуют
такие же руководства по программированию
и организации взаимодействия с пользователем, как на стороне Apple... Просто они не
являются обязательными.

В:

Разнообразие устройств является
проблемой и для iOS?

О:

Этот фактор безусловно должен учитываться при проектировании пользовательского интерфейса. Сейчас приходится рассматривать три размера: исходный экран
iPhone/iPod, новый экран iPhone 5 и экран
iPad. Также у каждого из этих устройств
существуют разные разрешения. Вам придется все чаще применять относительное
позиционирование в своих представлениях,
что в конечном итоге упростит проектирование для разных устройств.

процесс рецензирования и дизайн

У бассейна
Выловите из бассейна надписи и расставьте их по колонкам,
к которым они относятся (iPhone, iPad или iPod Touch).
Одна надпись может использоваться в нескольких
колонках. Ваша задача — составить полный список
функциональных возможностей iPhone, iPad и iPod Touch.

iPod Touch

iPad

iPhone

Внимание: каждый
предмет из
бассейна может
использоваться
многократно!

Сотовая связь
Просмотр видео
Может оснащаться камерой
Магнитометр
Внешний динамик
Камера
Может оснащаться GPS
Запуск приложений iPhone и iPad
Акселерометр
Запускается большинство приложений
Ограниченное определение местонахождения
GPS
Wi-Fi
Запись видео
iPod

дальше 

221

решение ребуса

У бассейна. Решение
Выловите из бассейна надписи и расставьте
их по колонкам, к которым они
относятся — iPhone, iPad или iPod Touch.
Одна надпись может использоваться
в нескольких колонках. Ваша
задача — составить полный список
функциональных возможностей iPhone,
iPad и iPod Touch.

Будьте
осторожны!

Этот список может
изменяться.

Apple постоянно
предлагает новые
устройства и новые возможности.
Проверьте сами!

Возможно, какие-то
пункты списка оказались неожиданными,
например динамик?

iPod Touch

iPhone

iPod

iPod

Запускается большинство
приложений

Запускается большинство
приложений

Просмотр видео

Просмотр видео

Просмотр видео

Ограниченное определение
местонахождения

GPS
Акселерометр

Ограниченное определение
местонахождения

Акселерометр

Wi-Fi

Акселерометр

Wi-Fi

Сотовая связь

Wi-Fi

Может оснащаться камерой

Камера

Некоторую информацию
о местонахождении можно
узнать по данным сетей
Wi-Fi.

Внешний динамик

Может поддерживать GPS
Может оснащаться
камерой
Внешний динамик
Запись видео

222

глава 5

Спорный
вопрос.

Запись видео
Магнитометр

Только на 3GS
и более новых
моделях

iPad
iPod
Запуск приложений
iPhone и iPad

процесс рецензирования и дизайн

ГЛАВА 5

Âàø èíñòðóìåíòàðèé Apple
Ваш инструментарий пополнился новыми
знаниями об экосистеме Apple.

ния
зирова
н
е
ц
е
р
с
Процес
бы
е, что

хотит
ли вы
рода Ес
ение п
ж
о
л
и
р
ваше п
e, вам
p Stor
p
A
в
а
ь
ь его н
валос
редат
е
п
я
с
придет
ие.
ирован
р еценз
ензиесс р ец
ц
о
р
п
анируя
время
 Пл
елите
д
ы
в
,
я
ую
ровани
вторн
ную по
ж
о
м
з
о
на в
вку.
отпра
ь
верят
ся про
т
е
д
и
р
ые
мп
ь разн
 Ва
живат
р
е
д
д
о
ые
ип
и разн
йства
ждого
устро
для ка
и
т
с
о
н
возмож
ства.
й
о
устр

Не пытайтесь...
...обойти ограничен
ие на покупку контента в пр
иложениях.
...неправильно запи
сывать названия любых прод
уктов Apple
или использовать
эти продукты в рекламе.
...занимать слишко
м много
памяти — особенно
для контента, не создава
емого пользователем.

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ


Если вы хотите создать хорошее приложение,
важно соблюдать правила Human Interface
Guidelines (HIG).



Частичная потеря гибкости дизайна компенсируется тем, что даже незнакомые приложения выглядят привычно для пользователя.



Запланируйте время на рецензирование,
но также рассчитывайте на то, что в результате выпущенное приложение будет содержать
меньше ошибок.



Apple жестко контролирует свои приложения.
Нравится вам это или нет — таков путь iOS
со всеми его достоинствами и недостатками.

дальше 

223

6 core data и ячейки табличного представления

Как поймать любимую
передачу
Я играю в «Остров Гиллигана».
А хорошо бы снова посмотреть
его по телевизору!

Устраивайтесь поудобнее и послушайте историю — историю о судьбоносном путешествии. Сегодня часто возникает одна
проблема: как работать с большими объемами данных и организовать их
представление в формате, подходящем для мобильных устройств? Это
можно делать многими способами, включая обработку данных и представление в формате, удобном для навигации и интерпретации. Для примера
возьмем программу телепередач: в эфире идет великое множество программ. Что делать поклоннику «Острова Гиллигана»?

вспоминая spincity

Ýòî âàøå ïðèëîæåíèå
Если не считать игр и приложений для чтения, большинство приложений на мобильных
устройствах предназначено для эффективного выбора и получения данных. Приложения —
счетчики калорий, календари, почтовые программы, программы чтения новостей, погодные
приложения — все это вариации на одну тему. До настоящего момента мы работали с простейшими способами хранения, массивами и списками plist.
Списки plist отлично подходят для хранения локальных данных, состоящих в основном из
чисел и строк. Хотите сохранить фотографии или видеоролики? Изображения? Списки plist
выглядят уже не так привлекательно. Производительность ухудшается, а передача данных с
устройства происходит неэффективно. Списки plist представляют собой файлы XML, поэтому операции загрузки и сохранения должны выполняться со всеми данными. Списки plist,
в отличие от баз данных, не поддерживают частичный произвольный доступ.

plist

и—

трок
ла и с
с
и
ч
о
Тольк те?
помни

226 глава 6

core data и ячейки табличного представления

Ýòî âàøå ïðèëîæåíèå ñ äàííûìè
Многие приложения работают с большими объемами данных.
Списки plist устанавливают ограничения на размеры и отношения
между данными, которые могут существовать в формате plist. Чтобы расширить возможности приложения по работе с данными, придется перейти на более сложную структуру управления данными.

ительный
Нужен дополн
орым все
уровень, с кот .
т
ае
т
бо
это зара

часто

Задаваемые
вопросы

В:
О:

Чем база данных отличается от списка plist?

И базы данных, и списки plist могут использоваться для хранения данных. Список plist в действительности представляет собой
файл XML, который используется для хранения простых и часто
используемых типов данных. Нужно сохранить несколько чисел или
простейших строк? Легко. Но когда требуется сохранить данные с
возможностью произвольного доступа или поиска или если ваши
данные слишком велики и не помещаются в памяти одновременно,
приходится искать другое решение.

В:
О:

Как определить, какой способ следует использовать?

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

дальше 

227

core data

Çíàêîìñòâî ñ Core Data
Загрузка и сохранение данных — особенно больших объемов — играют важную
роль во многих приложениях. А если вам потребуется отсортировать эти данные несколькими разными способами? Код, написанный для таких операций,
очень быстро устаревает. На помощь приходит Core Data...

Вывод

Core Data рабо
т
объектами. Вы ает с
определяете, как должны
выглядеть
ваши классы (н
азываемые
сущностями).

Core Data пред
ос
необходимый ко тавляет
д сохранения и загрузки
данных...

...и может сохр
ан
в разных форм ять их
атах —
например, в ба
зах данных
или простых
двоичных
файлах.

Ïîãîäèòå, ýòî åùå íå âñå!
Core Data упрощает загрузку и сохранение данных, но этим дело не ограничивается. Эта проверенная временем инфраструктура, которую компания Apple
перенесла из Mac OS X в iOS в версии 3.0, предоставляет следующие возможности:
1

Загрузка и сохранение объектов.
Core Data автоматически загружает и сохраняет объекты на основании описаний
сущностей. Core Data даже позволяет управлять отношениями между объектами,
выполнять миграцию данных при изменении версии, определять обязательные
и необязательные поля и организовать проверку полей.

2

Различные способы хранения данных.
Core Data скрывает механизм фактического хранения данных от приложения.
Операции чтения и записи могут выполняться как с базой данных SQLite, так
и с двоичным файлом — вы лишь должны сообщить Core Data, в какой форме
должны храниться ваши данные.

3

Управление памятью с отменой и возвратом.
Core Data исключительно эффективно реализует управление объектами в памяти
и отслеживание изменений в объектах. Инфраструктура может использоваться
для отмены и возврата, постраничного просмотра больших баз данных и т. д.

228 глава 6

core data и ячейки табличного представления

...Êñòàòè, î äàííûõ
У канала Head First Network появилась отличная идея для нового
приложения. Но похоже, у них возникли какие-то сложности.

HFN
Network
Head First

ые показы
т повторн
ю
Привет!
а
ж
о
б
о
ериал на
лей
тинговый с
ших зрите
й
а
е
н
р
з
й
и
ы
м
е
а
с
Многи
— это
Гиллигана»
«Острова
о!).
зн
але (серье
нашем кан
и помоожение, пр
л
и
р
п
re
to
оказа и
pp S
естить в A
списание п
а
зм
р
а
р
ть
и
зи
л
у
и
х эпит загр
Мы реш
их любимы
о
тели смогу
в
и
с
зр
ь
с
го
и
о
п
р
ю вози за
щи кото
осмотр ил
ользовател
р
п
п
ть
и
ть
в
а
в
та
о
с
р
нии поредо
заплани
в приложе
бходимо п
е
о
е
ы
н
н
н
е
а
д
кж
е
а
льны
нашими
зодов. Т
дополните
аботает с
р
ти
е
с
н
е
в
о
в

у
ть
можнос
код почем
и. Но наш
сле загрузк
данными.
нам?
Поможете

ÊËÞ×ÅÂÛÅ
ÌÎÌÅÍÒÛ
Как, по вашему мнению, действовали другие
разработчики? Может, вы готовы предложить
какие-то изменения?

дальше 

229

поиск показов

Ïðèëîæåíèå Gilligizer
Другие разработчики уже подготовили и создали представления, просто им нужно
немного помочь с управлением данными. В только что созданных представлениях
не выводится никакая информация. Происходит то же самое, что и в приложении
SpinCity, когда в нем выводились пустые представления.

ейти ому
ы пер
Чтоб лизированн а
а
к дет авлению, н .
»
т
+
с
«
д
ку
пре
е кноп
т
и
м
ж
Детализированное
представление
готово к использованию.
В основном это
базовый шаблон
разделенного
представления.

Исходная структура файлов
к
приложения Gilligizer близка
а.
структуре базового шаблон

Здесь появились новые инфрать
структуры. Чтобы добави
a,
Dat
e
Cor
уру
укт
инфрастр
e
установите флажок «use Cor
я.
ени
лож
при
и
ани
созд
Data» при

230 глава 6

core data и ячейки табличного представления

t
Упражнение

Постройте приложение Gilligizer. Как и в предыдущих случаях,
приложение находится в GitHub, готовое к загрузке и запуску.

1

Загрузите готовый код из GitHub.
Вместо того чтобы создавать новый проект, мы скопируем его из
репозитория (как это было сделано в главе 1). На экране «Welcome to
Xcode» выберите вариант Checkout an Existing Project, затем вариант
«Repository». В поле должен содержаться адрес https://github.com/dpilone/
Head-First-iPhone-iPad-Development-3rd-Edition.git, который мы использовали
ранее в книге.

2

Выберите нужный раздел.
Исходная версия кода каждой главы размещается в соответствующем
разделе. Выберите раздел главы 6 и нажмите кнопку Next. Остается
выбрать место сохранения и имя (например, chapter 6 или Gilligizer)
и нажать кнопку «Checkout».

3

Протестируйте приложение.
Проект находится на вашем компьютере; постройте и запустите его.
Приложение должно работать с минимумом функций!

Теперь, когда вся подготови
подготовительная работа
проделана, можно переходить к данным!
дальше 

231

начинаем работать с core data

Core Data íà÷èíàåòñÿ ñ äàííûõ
Как и в большинстве задач управления данными, сначала необходимо построить модель
данных и интегрировать ее в приложение. Так как макет детализированного представления
уже создан, мы можем воспользоваться им для определения того, какие данные необходимо
включить в приложение. Пока что самым простым способом будет ручной ввод данных пользователем. Не беспокойтесь, позднее в приложение будет добавлена большая база данных
с расписанием передач.

Название серии.

Краткое описание
серии.

Каждой серии
присваивается
идентификатор,
по которому ее
можно легко найти.

Новая серия? Если
сериал уже показы
это
м,
ло
ош
пр
в
я
лс
ва
...
обычная ситуация

какое
Самое важное — на
з?
ка
по
ен
ач
зн
на
время
ии
По этой информац
делит,
пользователь опре
осм
по
сможет ли он
.
чу
да
ре
пе
ь
трет

232 глава 6

core data и ячейки табличного представления

Развлечения с магнитами
Используйте то, что вы узнали из приложения SpinCity, для заполнения пропусков
в данных передачи. Пока нам нужно хотя бы примерно представить, какие поля
нам понадобятся.

Класс Show

D;
isodeI
r * ep
e
b
m
u
N
NS
h>
/UIKit.h
#import