Создание пользовательского довольный контроллеры представления
Пользовательский довольный контроллеры представления являются основой Вашего приложения. Вы используете их для представления уникального содержания приложения. Для всех приложений нужен по крайней мере один пользовательский довольный контроллер представления. Сложные приложения делят рабочую нагрузку между многократными контроллерами содержания.
Контроллер представления имеет много ответственности. Часть этой ответственности является вещами, которые iOS требует, чтобы контроллер представления сделал. Другая ответственность является вещами, которые Вы присваиваете контроллеру представления при определении его роли в приложении.
Анатомия довольного контроллер представления
UIViewController
класс обеспечивает фундаментальную инфраструктуру для реализации всех пользовательских контроллеров представления. Вы определяете пользовательский подкласс UIViewController
. Тот подкласс обеспечивает необходимый код, чтобы заполнить представления с данными и реагировать на пользовательские действия. Когда Вы хотите внести изменения в поведение по умолчанию контроллера представления, Вы переопределенные методы UIViewController
класс. Ваш контроллер представления может также взаимодействовать с другими классами UIKit для реализации поведения, которое Вы хотите.
Рисунок 3-1 показывает некоторые ключевые объекты, связанные непосредственно с довольным контроллер представления. Это объекты, по существу принадлежащие и управляющиеся самим контроллером представления. Представление (доступный через view
свойство), единственный объект, который должен быть предоставлен, несмотря на то, что большинству контроллеров представления присоединили дополнительные подпредставления к этому представлению, а также пользовательским объектам, содержащим данные, они должны вывести на экран.
При разработке нового контроллера представления он потенциально имеет много ответственности. Часть той ответственности выглядит входящей к представлениям и другим объектам, которыми это управляет. Другая ответственность выглядит исходящей к другим контроллерам. Следующие разделы перечисляют многую из общей ответственности для контроллера представления.
Контроллеры представления управляют ресурсами
Некоторые объекты инстанцируют, когда контроллер представления инициализируют и избавляются, когда выпущен Ваш контроллер представления. Другие объекты, как представления, необходимы только, когда содержание контроллера представления видимо на экране. Когда память недостаточна, в результате контроллеры представления используют ресурсы эффективно и должны быть подготовлены высвободить средства. Должным образом реализация этого поведения в контроллерах представления Вашего приложения делает его так, Ваше приложение использует память и другие ресурсы — такие как CPU, GPU и батарея — более эффективно.
Посмотрите управление ресурсами в поле зрения контроллеры.
Контроллеры представления управляют представлениями
Контроллеры представления управляют своим представлением и его подпредставлениями, но кадр представления — его позиция и размер в представлении его родителя — часто определяются другими факторами, включая ориентацию устройства, видима ли строка состояния и даже как представление контроллера представления выведено на экран в окне. Ваш контроллер представления должен быть разработан к расположению его представление для адаптации кадру, предоставленному для него.
Управление представлением имеет другие аспекты также. Когда его представление собирается появиться и исчезнуть из экрана, Ваш контроллер представления уведомляется. Ваш контроллер представления может использовать это уведомление для выполнения других действий, необходимых для его работы.
Посмотрите изменение размеров представлений контроллера представления, поддерживая многократные интерфейсные ориентации, ответив на связанные с дисплеем уведомления.
Контроллеры представления реагируют на события
Ваш контроллер представления часто является центральным объектом координирования для своих представлений и средств управления. Как правило, Вы разрабатываете свой пользовательский интерфейс так, чтобы средства управления отправили сообщения в контроллер, когда пользователь управляет ими. Ваш контроллер представления, как ожидают, обработает сообщение, делая любые необходимые изменения в представления или данные сохраненными в контроллере представления.
Ваш контроллер представления также участвует в цепочке респондента, используемой для поставки событий приложению. Вы можете, переопределенные методы в Вашем классе контроллера представления для имения его участвуют непосредственно в обработке событий. Контроллеры представления также являются хорошими объектами реализовать другие способы поведения — такие как ответ на системные уведомления, таймеры или события, определенные для Вашего приложения.
Посмотрите Используя контроллеры представления в цепочке респондента.
Координата контроллеров представления с другими контроллерами
Несмотря на то, что контроллер представления может создать и управлять многими другими объектами, он не должен обычно представлять эти объекты публично проверке или модификации. Это может сотрудничать с другими объектами (особенно другие контроллеры представления), но это должно представить наименьшее количество числа свойств и методов, необходимых, чтобы позволить его сотрудникам связываться с ним. Представление слишком многих подробных данных реализации в Вашем классе контроллера представления мешает изменять Вашу реализацию контроллера представления. Сотрудники, полагающиеся на эти подробные данные реализации, должны были бы быть изменены, чтобы продолжать работать с Вашим классом контроллера представления.
Посмотрите усилия по координированию между контроллерами представления.
Контроллеры представления часто работают с контейнерами
Если Ваш контроллер представления помещается в контейнерном контроллере представления, контейнер налагает дополнительные ограничения, как показано на рисунке 3-2. Контейнер может попросить, чтобы Ваш контроллер представления для обеспечения других объектов раньше конфигурировал пользовательский интерфейс контейнера. Например, довольное контроллер представления, помещенный в контроллере представления вкладки, обеспечивает элемент панели вкладок для отображения для той вкладки.
Свойства, используемые для конфигурирования контейнеров, предоставленных UIKit, определяются UIViewController
класс. Для получения дополнительной информации об определенных типах контейнеров и свойств Вы конфигурируете, чтобы поддерживать их, видеть Каталог Контроллера Представления для iOS.
Контроллеры представления могут быть представлены другими контроллерами представления
Некоторые контроллеры представления, которые Вы разрабатываете, предназначаются, чтобы быть представленными другими контроллерами представления. Вы могли бы представить свой контроллер представления непосредственно, или Вы могли бы сделать его дочерним элементом контейнерного контроллера представления и представить контейнер вместо этого. Когда представлено, это перемещается на экране, оставаясь там, пока это не отклонено.
Существует несколько причин, Вы могли бы представить контроллер представления:
Собрать информацию от пользователя сразу.
Представить некоторое содержание временно.
Изменить режимы работы временно.
Реализовать альтернативные интерфейсы для различных ориентаций устройства.
Подарить новой иерархии представления определенный тип анимированного перехода (или никакой переход).
Большинство этих причин включает прерывание потока операций Вашего приложения временно, чтобы собрать или вывести на экран некоторую информацию. В почти всех случаях представленный контроллер представления реализует делегата. Представленный контроллер представления использует делегата для передачи с контроллером представления представления. После того, как Ваше приложение имеет информацию, в которой оно нуждается (или пользователь заканчивает просматривать представленную информацию), представленный контроллер представления передает этот назад к контроллеру представления представления. Контроллер представления представления отклоняет представленный контроллер представления для возврата приложения его предыдущему состоянию.
Посмотрите контроллеры представления представления от других контроллеров представления.
Разработка Вашего довольного контроллер представления
Прежде, чем записать любой код в Вашем контроллере представления, необходимо быть в состоянии ответить на некоторые основные вопросы о том, как Вы намереваетесь использовать его. Вопросы, предоставленные ниже, разработаны, чтобы помочь Вам сузить фокус своего контроллера представления и помочь Вам понять роль, которую это играет в Вашем приложении. В частности это помогает Вам идентифицировать соединения — обычно к другим контроллерам — Ваш контроллер представления должен выполнить свои задачи.
Вы используете раскадровку для реализации контроллера представления?
Когда это инстанцируют?
Какие данные это показывает?
Какие задачи это выполняет?
Как его представление выведено на экран на экране?
Как это сотрудничает с другими контроллерами представления?
Ваши ответы на эти вопросы не должны быть точными при тихой разработке роли, она играет. Однако, это помогает иметь общий смысл того, что делает Ваш контроллер представления и как другие объекты взаимодействуют с ним.
Вопросы выше не просят, чтобы Вы определили появление своего контроллера представления или были точны о подробных данных реализации того, как это выполняет задачи, которые Вы присвоили ему. Те - важные вопросы, на которые необходимо ответить, но ни одна из этих вещей не должна влиять открытый интерфейс контроллера представления. Вы хотите, чтобы гибкость была в состоянии изменить визуальное проектирование Вашего контроллера представления, не изменяя объявление класса, определяющее, как другие контроллеры сотрудничают с ним.
Используйте раскадровку для реализации контроллера представления
Вы могли бы рассмотреть, использовать ли раскадровку в качестве подробности реализации, но подход, Вы берете влияние, как Вы реализуете контроллер представления и как другие объекты сотрудничают с ним. Вы всегда используете раскадровку, если у Вас нет веской причины не к.
Когда Вы используете раскадровки:
iOS обычно инстанцирует Вашего контроллера представления для Вас автоматически.
Чтобы закончить инстанцировать его, Вы переопределяете
awakeFromNib
метод.Другие объекты конфигурируют его через его свойства.
Вы создаете его иерархию представления и другие связанные объекты в Интерфейсном Разработчике. Когда представление необходимо, эти объекты загружаются автоматически.
Отношения с другими контроллерами представления создаются в раскадровке.
Если Вы разрабатываете свой контроллер представления, который будет использоваться программно:
Контроллер представления инстанцируют путем выделения и инициализации его.
Вы создаете пользовательский метод инициализации для инициализации контроллера представления.
Другие объекты конфигурируют контроллер представления с помощью его метода инициализации и путем конфигурирования его свойств.
Вы переопределяете
loadView
метод, чтобы программно создать и сконфигурировать его иерархию представления.Отношения с другими контроллерами представления создаются путем записи кода.
Знайте, когда инстанцируют Ваш контроллер
Знание, когда Ваш контроллер представления инстанцируют обычно, подразумевает другие подробные данные для того, как работает Ваше приложение. Например, Вы могли бы знать, что Ваш контроллер представления всегда инстанцирует тот же объект. Часто объекты, инстанцирующие контроллеров представления, являются самостоятельно контроллерами представления; это почти всегда имеет место в приложении, использующем раскадровки. В любом случае, зная, когда, почему, и то, какой объект Ваш контроллер представления инстанцируют, дает Вам понимание информации, обменянной между Вашим контроллером представления и объектом, создавшим его.
Знайте, какие данные Ваш контроллер представления показывает и возвращает
При ответе на эти два вопроса Вы работаете для понимания модели данных для приложения и также должны ли те данные быть переданы между контроллерами представления.
Вот некоторые общие образцы, которые необходимо ожидать видеть в контроллерах представления:
Контроллер представления получает данные от другого контроллера и выводит на экран его, не предлагая способ отредактировать его. Никакие данные не возвращаются.
Контроллер представления позволяет пользователю вводить новые данные. После того, как пользователь заканчивает редактировать данные, они отправляют новые данные в другой контроллер.
Контроллер представления получает данные от другого контроллера и позволяет пользователю редактировать его. После того, как пользователь заканчивает редактировать данные, они отправляют новые данные в другой контроллер.
Контроллер представления не отправляет или получает данные. Вместо этого это показывает статичные представления.
Контроллер представления не отправляет или получает данные. Вместо этого его реализация загружает его данные, не представляя этот механизм другим контроллерам представления. Например,
GKAchievementViewController
класс имеет встроенную функциональность для определения, какой проигрыватель аутентифицируется на устройстве. Это также знает, как загрузить данные того проигрывателя из Игрового Центра. Контроллер представления представления не должен знать, какие данные загружаются или как это было загружено.
Вы не ограничиваетесь использовать только эти проекты.
Когда перемещения данных в или из Вашего контроллера представления, полагайте, что определение класса модели данных содержит данные, которые будут переданы новому контроллеру. Например, в Вашем Втором приложении для iOS: Раскадровки, главный контроллер использует a BirdSighting
объект отправить данные связался с наблюдением к подробному контроллеру. Используя объект для этого упрощает обновлять данные для включения дополнительных свойств, не изменяя сигнатуры методов в классах контроллера.
Знайте, какие задачи Ваш контроллер позволяет пользователю выполнять
Некоторые контроллеры представления позволяют пользователям просматривать, создавать, или редактировать данные. Другие контроллеры представления позволяют пользователям перейти на другие экраны содержания. И некоторые позволяют пользователям выполнять задачи, предоставленные контроллером представления. Например, MFMailComposeViewController
класс позволяет пользователю составлять и посылать электронные письма другим пользователям. Это обрабатывает низкоуровневые подробные данные передающих сообщений электронной почты.
Поскольку Вы определяете, который определяет задачу для Вашего контроллера представления, выполняет, решите, сколько управления теми задачами Ваш контроллер представления представляет другим контроллерам. Много контроллеров представления могут выполнить задачи, не представляя данные конфигурации другим контроллерам. Например, GKAchievementViewController
класс выводит на экран достижения пользователю, не представляя свойств, чтобы сконфигурировать, как он загружает или представляет свои данные. MFMailComposeViewController
класс представляет немного отличающийся сценарий путем представления некоторых свойств, которые другой контроллер может использовать для конфигурирования начального содержания, которое это выводит на экран. После этого пользователь может отредактировать содержание и отправить, электронное письмо, не давая другой контроллер возражает шансу влиять на тот процесс.
Знайте, как Ваш контроллер представления выведен на экран на экране
Некоторые контроллеры представления разработаны, чтобы быть корневыми контроллерами представления. Другие ожидают быть представленными другим контроллером представления или помещенными в контейнерный контроллер. Иногда, Вы разрабатываете контроллеры, которые могут быть выведены на экран многократными способами. Например, ведущее представление контроллера представления разделения выведено на экран в представлении разделения в альбомном режиме и в управлении легкой сдобой в режиме портрета.
Знание, как Ваш контроллер представления выведен на экран, дает Вам понимание, как его представление измерено и помещено на экране. Это также влияет на другие области, такие как определение, с чем другими контроллерами сотрудничает Ваш контроллер представления.
Знайте, как Ваш контроллер сотрудничает с другими контроллерами
Этой точкой Вы уже знаете некоторые вещи о сотрудничестве. Например, если Ваш контроллер представления инстанцируют от перехода, то он, вероятно, сотрудничает с исходным контроллером представления, конфигурирующим его. И если Ваш контроллер является дочерним элементом контейнера, то он сотрудничает с контейнером. Но существуют отношения в другом направлении также. Например, Ваш контроллер представления мог бы задержать часть своей работы и передать его к другому контроллеру представления. Это могло бы даже обмениваться данными с существующим контроллером представления.
Со всеми этими соединениями Ваш контроллер представления обеспечивает интерфейс, который используют другие контроллеры, или он знает о других контроллерах, и он использует их интерфейсы. Эти соединения важны для обеспечения бесшовного опыта, но они также представляют проблемы проекта, потому что они представляют зависимости между классами в Вашем приложении. Зависимости являются проблемой, потому что они делают более трудным изменить любой класс в изоляции от других классов, составляющих Ваше приложение. Поэтому необходимо сбалансировать потребности приложения теперь против потенциальной потребности сохранить проект приложения достаточно гибким для изменения позже.
Примеры проектов контроллера общего представления
Разработка нового контроллера представления может быть сложной. Это помогает смотреть на существующие проекты и понять то, что они делают и почему. Этот следующий раздел говорит о некоторых стилях контроллера общего представления, используемых в приложениях для iOS. Каждый пример включает описание роли игры контроллера представления, краткое описание того, как это работает на высоком уровне и одном возможном списке ответов на упомянутые выше вопросы о проекте.
Пример: игровой экран заголовка
Заявление о миссии
Контроллер представления, позволяющий пользователю выбирать между различными стилями игровой игры.
Описание
Когда игра запускается, она редко переходит прямо в фактическую игру. Вместо этого это выводит на экран экран заголовка, идентифицирующий игру и представляющий ряд игровых вариантов проигрывателю. Например, игра могла бы предложить кнопки, позволяющие проигрывателю запускать сингла или многопользовательскую игру. Когда пользователь выбирает одну из опций, приложение конфигурирует себя соответственно и начинает его геймплей.
Экран заголовка интересен в частности, потому что его содержание статично; им не нужны данные от другого контроллера. Также, этот контроллер представления почти полностью самодостаточен. Это действительно, однако, знает о других контроллерах представления, потому что это инстанцирует других контроллеров представления для запуска его геймплея.
Проект
Вы используете раскадровку для реализации контроллера представления? Да.
Когда это инстанцируют? Этот контроллер представления является начальной сценой в основной раскадровке.
Какие данные это показывает? Этот класс дисплеи предварительно сконфигурировал средства управления и изображения; это не представляет пользовательские данные. Это не включает конфигурируемые свойства.
Какие задачи это выполняет? Когда пользователь касается на кнопке, она инициировала переход для инстанцирования другого контроллера представления. Каждый переход идентифицируется так, чтобы могла быть сконфигурирована надлежащая игровая игра.
Как его представление выведено на экран на экране? Это установлено автоматически как корневой контроллер представления окна.
Как это сотрудничает с другими контроллерами представления? Это инстанцирует другого контроллера представления для представления экрана геймплея. Когда геймплей заканчивается, другой контроллер представления отправляет сообщение в экранный контроллер заголовка, чтобы сообщить ему, что закончилась игра. Экранный контроллер заголовка тогда отклоняет другой контроллер представления.
Альтернативные конструктивные соображения
Ответы по умолчанию предполагают, что никакие пользовательские данные не выведены на экран. Некоторые игры включают данные проигрывателя для конфигурирования представлений или средств управления. Например:
Вы могли бы хотеть, чтобы контроллер представления вывел на экран Игровой псевдоним Центра пользователя.
Вы могли бы хотеть, чтобы он включил или отключил кнопки на основе того, подключено ли устройство к Игровому Центру.
Вы могли бы хотеть, чтобы он включил или отключил кнопки на основе Закупаемых изделий В приложении, которые купил пользователь.
Когда эти дополнительные элементы добавляются к проекту, контроллер представления берет на себя более традиционную роль. Это могло бы получить объекты данных или контроллеры данных от делегата приложения так, чтобы это могло запросить и обновить это состояние по мере необходимости. Или, поскольку это - корневой контроллер представления для окна, Вы могли бы просто реализовать те способы поведения непосредственно в экранном контроллере заголовка. Фактический проект, вероятно, зависит от того, как гибкий Вам нужен Ваш код, чтобы быть.
Пример: основной контроллер представления
Заявление о миссии
Начальный контроллер представления контроллера навигации, используемого для отображения списка доступных объектов данных приложения.
Описание
Основной контроллер представления является очень общей частью основанного на навигации приложения. Например, Ваше Второе приложение для iOS: Раскадровки используют основное представление для отображения списка наблюдений за птицей. Когда пользователь выбирает наблюдение из списка, основной контроллер представления продвигает новый подробный контроллер на экран.
Поскольку этот контроллер представления выводит на экран список элементов, он разделяет на подклассы UITableViewController
вместо UIViewController
.
Проект
Вы используете раскадровку для реализации контроллера представления? Да.
Когда это инстанцируют? Как корневой контроллер представления контроллера навигации, это инстанцируют в то же время, что и его родитель.
Какие данные это показывает? Высокоуровневое представление данных приложения. Это реализует свойства что делегат приложения использование для предоставления данных ему. Например, птица, смотря приложение обеспечивает пользовательский объект контроллера данных для основного контроллера представления.
Какие задачи это выполняет? Это реализует кнопку Add, чтобы позволить пользователям создавать новые записи.
Как его представление выведено на экран на экране? Это - дочерний элемент контроллера навигации.
Как это сотрудничает с другими контроллерами представления? Когда пользователь касается на элементе в списке, это использует переход нажатия для показа подробного контроллера. Когда пользователь касается на кнопке Add, она использует модальный переход для представления нового контроллера представления, редактирующего новую запись. Это получает данные назад от этого модального контроллера представления и отправляет эти данные в контроллер данных для создания нового наблюдения за птицей.
Альтернативные конструктивные соображения
Контроллер навигации и начальный контроллер представления используются при создании приложения для iPhone. При разработке того же приложения для iPad основной контроллер представления является дочерним элементом контроллера представления разделения вместо этого. Большинство других проектных решений остается то же.
Пример: подробный контроллер представления
Заявление о миссии
Контроллер, продвинутый на навигацию, складывает для отображения подробных данных для элемента списка, выбранного из основного контроллера представления.
Описание
Подробный контроллер представления представляет более подробное представление элемента списка, выведенного на экран основным контроллером представления. Как с основным контроллером представления, список появляется в интерфейсе панели навигации. Когда пользователь заканчивает просматривать элемент, они нажимают кнопку в панели навигации для возврата к основному представлению.
Ваше Второе приложение для iOS: Раскадровки используют UITableViewController
класс для реализации его подробного представления. Это использует помехи ячейки таблицы, каждая из которых получает доступ к одной части птицы, увидевшей данные. Статическое табличное представление является хорошим способом реализовать этот проект.
Проект
Вы используете раскадровку для реализации контроллера представления? Да.
Когда это инстанцируют? Это инстанцирует переход нажатия от основного контроллера представления.
Какие данные это показывает? Это показывает данные, хранившие в пользовательском объекте данных. Это объявляет, что свойства, сконфигурированные исходным контроллером представления, предоставляют эти данные.
Какие задачи это выполняет? Это позволяет пользователю отклонять представление.
Как его представление выведено на экран на экране? Это - дочерний элемент контроллера навигации.
Как это сотрудничает с другими контроллерами представления? Это получает данные от основного контроллера представления.
Альтернативные конструктивные соображения
Контроллер навигации чаще всего используется при создании приложения для iPhone. При разработке того же приложения для iPad подробный контроллер представления является дочерним элементом контроллера представления разделения вместо этого. Многие из других подробных данных реализации остаются то же.
Если для Вашего приложения нужно больше пользовательского поведения представления, оно могло бы разделить на подклассы UIViewController
класс и реализация его собственная иерархия представления.
Пример: почта составляет контроллер представления
Заявление о миссии
Контроллер представления, позволяющий пользователю составлять и посылать электронное письмо.
Описание
Сообщение платформа UI обеспечивает MFMailComposeViewController
класс. Этот класс позволяет пользователю составлять и посылать электронное письмо. Этот контроллер представления интересен, потому что он действительно больше, чем просто показывает или редактирует данные — он фактически посылает электронное письмо.
Другое интересное проектное решение в этом классе - то, что он позволяет приложению обеспечивать начальную конфигурацию для электронного письма. После того, как начальная конфигурация была представлена, пользователь может переопределить этот выбор прежде, чем отправить почту.
Проект
Вы используете раскадровку для реализации контроллера представления? Нет.
Когда это инстанцируют? Это инстанцируют программно.
Какие данные это показывает? Это показывает различные части электронного письма, включая список получателей, заголовок, присоединения и само электронное письмо. Класс обеспечивает свойства, позволяющие другому контроллеру представления предварительно конфигурировать электронное письмо.
Какие задачи это выполняет? Это посылает электронное письмо.
Как его представление выведено на экран на экране? Контроллер представления представлен другим контроллером представления.
Как это сотрудничает с другими контроллерами представления? Это возвращает информацию о статусе своему делегату. Это состояние позволяет контроллеру представления представления знать, было ли послано электронное письмо.
Контрольный список реализации для пользовательского, довольного контроллеры представления
Для любого пользовательского довольного контроллеры представления, которые Вы создаете, существует несколько задач, что у Вас должен быть свой дескриптор контроллера представления:
Необходимо сконфигурировать представление, которое будет загружено контроллером представления.
Ваш пользовательский класс, возможно, должен переопределить определенные методы, чтобы управлять, как его иерархия представления загружена и разгружена. Эти те же методы могли бы управлять другими ресурсами, создающимися одновременно. Посмотрите управление ресурсами в поле зрения Контроллеры.
Необходимо решить, какие ориентации устройства поддержки контроллера представления и как это реагирует на изменение в ориентации устройства; посмотрите Поддерживающие Многократные Интерфейсные Ориентации.
Поскольку Вы реализуете свой контроллер представления, Вы, вероятно, обнаружите, что необходимо определить методы действия или выходы для использования с его представлениями. Например, если иерархия представления содержит таблицу, Вы, вероятно, хотите сохранить указатель на ту таблицу в выходе так, чтобы можно было получить доступ к нему позже. Точно так же, если Ваша иерархия представления содержит кнопки или другие средства управления, Вы, вероятно, хотите, чтобы те средства управления вызвали связанный метод действия для контроллера представления. Поскольку Вы выполняете итерации через определение Вашего класса контроллера представления, можно поэтому найти, что необходимо добавить следующие элементы к классу контроллера представления:
Заявленные свойства, указывающие на объекты, содержащие данные, которые будут выведены на экран соответствующими представлениями
Открытые методы и свойства, представляющие пользовательское поведение контроллера Вашего представления другим контроллерам представления
Выходы, указывающие на представления в иерархии представления, с которой должен взаимодействовать Ваш контроллер представления
Методы действия, выполняющие задачи, связанные с кнопками и другими средствами управления в иерархии представления