Используя контроллеры представления в Вашем приложении
Работаете ли Вы с контроллерами представления, предоставленными iOS, или с пользовательскими контроллерами Вы создали для показа содержания приложения, Вы используете подобный набор методов для фактической работы с контроллерами представления.
Наиболее распространенный метод для работы с контроллерами представления должен разместить их в раскадровке. Размещение контроллеров представления в раскадровке позволяет Вам непосредственно устанавливать отношения между контроллерами представления в Вашем приложении, не пишущий код. Вы видите поток управления — от контроллеров, создаваемых, когда Ваше приложение сначала запускается к контроллерам, которые инстанцируют в ответ на действия пользователя. iOS управляет большей частью этого процесса путем инстанцирования этих контроллеров представления только, когда для приложения нужны они.
Иногда Вы, возможно, должны создать контроллер представления путем выделения и инициализации его программно. При работе с контроллерами представления непосредственно, необходимо записать код, инстанцирующий контроллера представления, конфигурирующий его и выводящий на экран его.
Работа с контроллерами представления в раскадровках
Рисунок 2-1 показывает пример раскадровки. Эта раскадровка включает контроллеры представления, связанные представления и стрелки соединения, устанавливающие отношения между контроллерами представления. В действительности эта раскадровка рассказывает историю, начиная с одной сцены и позже показывающих других в ответ на действия пользователя.
Раскадровка может определять один контроллер представления быть начальным контроллером представления. Если раскадровка представляет определенный поток операций через часть Вашего UI, начальный контроллер представления представляет первую сцену в том потоке операций.
Вы устанавливаете отношения с начального контроллера представления на другие контроллеры представления в раскадровке. В свою очередь, Вы устанавливаете отношения от тех контроллеров представления до других, в конечном счете соединяясь больше всего или всех сцен раскадровки в единственный связный граф. Тип отношений, которые Вы устанавливаете, определяет, когда подключенный контроллер представления инстанцирует iOS, следующим образом:
Если отношение является переходом, целевой контроллер представления инстанцируют, когда инициирован переход.
Если отношение представляет включение, дочерний контроллер представления инстанцируют, когда инстанцируют его родитель.
Если контроллер не является местом назначения или дочерним элементом другого контроллера, он никогда не инстанцируют автоматически. Необходимо инстанцировать его от раскадровки программно.
Для идентификации определенного контроллера представления или перехода в раскадровке используйте Интерфейсного Разработчика для присвоения его строка идентификатора, однозначно определяющая его. Чтобы программно загрузить контроллер представления из раскадровки необходимо присвоить его идентификатор. Точно так же для инициирования перехода программно это должно также быть присвоено идентификатор. Когда переход инициирован, что идентификатор перехода передается исходному контроллеру представления, использующему его для определения, какой переход был инициирован. Поэтому рассмотрите маркировку каждого перехода с идентификатором.
При создании приложения с помощью раскадровок можно использовать единственную раскадровку для содержания всех ее контроллеров представления, или можно создать многократные раскадровки и реализовать часть пользовательского интерфейса в каждом. Одна раскадровка в Вашем приложении почти всегда определяется как основная раскадровка. Если существует основная раскадровка, iOS загружает ее автоматически; другие раскадровки должны быть явно загружены Вашим приложением.
Основная раскадровка инициализирует пользовательский интерфейс Вашего приложения
Основная раскадровка определяется в информационном файле списка свойств приложения. Если основная раскадровка объявляется в этом файле, то, когда Ваше приложение запускается, iOS выполняет следующие шаги:
Это инстанцирует окна для Вас.
Это загружает основную раскадровку и инстанцирует ее начального контроллера представления.
Это присваивает новый контроллер представления окну
rootViewController
свойство и затем делает окно видимым на экране.
Вашего делегата приложения вызывают для конфигурирования начального контроллера представления, прежде чем он будет выведен на экран. Точный набор шагов использование iOS для загрузки основной раскадровки описан в Координировании Усилий Между Контроллерами Представления.
Переходы автоматически инстанцируют целевого контроллера представления
Переход представляет инициированный переход, приносящий новый контроллер представления в пользовательский интерфейс Вашего приложения.
Переходы содержат большую информацию о переходе, включая следующее:
Объект, заставивший переход быть инициированным, известный как отправитель
Исходный контроллер представления, запускающий переход
Целевой контроллер представления, который инстанцируют
Вид перехода, который должен использоваться для обеспечения целевого контроллера представления на экране
Дополнительная строка идентификатора, идентифицирующая тот определенный переход в раскадровке
Когда переход инициирован, iOS принимает следующие меры:
Это инстанцирует целевого контроллера представления с помощью значений атрибута, которые Вы обеспечили в раскадровке.
Это дает исходному контроллеру представления возможность сконфигурировать новый контроллер.
Это выполняет переход, сконфигурированный в переходе.
Инициирование перехода программно
Переход обычно инициирован, потому что объект, связанный с исходным контроллером представления, таким как устройство распознавания управления или жеста, инициировал переход. Однако переход может также быть инициирован программно Вашим приложением, пока переход имеет присвоенный идентификатор. Например, когда матч заканчивается, при реализации игры Вы могли бы инициировать переход. Целевой контроллер представления тогда выводит на экран окончательные оценки соответствия.
Вы программно инициировали переход путем вызова исходного контроллера представления performSegueWithIdentifier:sender:
метод, передающий в идентификаторе для перехода, который будет инициирован. Вы также передаете в другом объекте, действующем как отправитель. Когда исходный контроллер вызывают для конфигурирования целевого контроллера представления, и объект отправителя и идентификатор для перехода предоставлены для него.
Перечисление 2-1 показывает простой метод, инициировавший переход. Этим примером является часть большего примера, описанного в Создании Альтернативного Альбомного Интерфейса. В этой сокращенной форме Вы видите, что контроллер представления получает уведомление ориентации. Когда контроллер представления находится в режиме портрета, и устройство повернуто в альбомную ориентацию, метод использует переход для представления контроллера другого представления на экране. Поскольку объект уведомления в этом случае не предоставляет полезной информации для выполнения команды перехода, контроллер представления делает себя отправителем.
Перечисление 2-1 , Инициировавшее переход программно
- (void)orientationChanged:(NSNotification *)notification |
{ |
UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; |
if (UIDeviceOrientationIsLandscape(deviceOrientation) && |
!isShowingLandscapeView) |
{ |
[self performSegueWithIdentifier:@"DisplayAlternateView" sender:self]; |
isShowingLandscapeView = YES; |
} |
// Remainder of example omitted. |
} |
Если переход может быть инициирован только программно, Вы обычно привлекаете стрелку соединения непосредственно с исходного контроллера представления на целевой контроллер представления.
Инстанцирование контроллера представления раскадровки программно
Можно хотеть программно инстанцировать контроллера представления, не используя переход. Раскадровка все еще ценна, потому что можно использовать ее для конфигурирования атрибутов контроллера представления, а также его иерархии представления. Однако при инстанцировании контроллера представления программно Вы не получаете ни одного поведения перехода. Для отображения контроллера представления необходимо реализовать дополнительный код. Поэтому необходимо полагаться на переходы, где возможный и используют этот метод только при необходимости.
Вот шаги, которые должен реализовать Ваш код:
Получите объект раскадровки (объект
UIStoryboard
класс).Если у Вас есть существующий контроллер представления, который инстанцируют от той же раскадровки, считайте
storyboard
свойство для получения раскадровки. Для загрузки различной раскадровки вызовитеUIStoryboard
классstoryboardWithName:bundle:
метод класса, передающий от имени файла раскадровки и дополнительного параметра пакета.Вызовите объект раскадровки
instantiateViewControllerWithIdentifier:
метод, передающий в идентификаторе, который Вы определили для контроллера представления при создании его в Интерфейсном Разработчике.Также можно использовать
instantiateInitialViewController
метод для инстанцирования начального контроллера представления в раскадровке, не будучи должен знать ее идентификатор.Сконфигурируйте новый контроллер представления путем установки его свойств.
Выведите на экран новый контроллер представления. Посмотрите Отображение Представления Содержание Контроллера Программно.
Перечисление 2-2 показывает пример этого метода. Это получает раскадровку от существующего контроллера представления и инстанцирует нового контроллера представления с помощью него.
Перечисление 2-2 , Инстанцирующее другого контроллера представления в той же раскадровке
- (IBAction)presentSpecialViewController:(id)sender { |
UIStoryboard *storyboard = self.storyboard; |
SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"]; |
// Configure the new view controller here. |
[self presentViewController:svc animated:YES completion:nil]; |
} |
Перечисление 2-3 показывает другой часто используемый метод. Этот пример загружает новую раскадровку и инстанцирует ее начального контроллера представления. Это использует этот контроллер представления в качестве корневого контроллера представления для нового окна, помещаемого во внешний экран. Для отображения возвращенного окна приложение вызывает окно makeKeyAndVisible
метод.
Перечисление 2-3 , Инстанцирующее контроллера представления от новой раскадровки
- (UIWindow*) windowFromStoryboard: (NSString*) storyboardName |
onScreen: (UIScreen*) screen |
{ |
UIWindow *window = [[UIWindow alloc] initWithFrame:[screen bounds]]; |
window.screen = screen; |
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil]; |
MainViewController *mainViewController = [storyboard instantiateInitialViewController]; |
window.rootViewController = mainViewController; |
// Configure the new view controller here. |
return window; |
} |
Переход к новой раскадровке требует программируемого подхода
Переходы соединяют только сцены, которые сохранены в той же раскадровке. Для отображения контроллера представления от другой раскадровки необходимо явно загрузить файл раскадровки и инстанцировать контроллера представления в нем.
Нет никакого требования, чтобы Вы создали многократные раскадровки в своем приложении. Вот, тем не менее, несколько случаев, где многократные раскадровки могли бы быть полезны для Вас:
У Вас есть многочисленная команда программистов с различными частями пользовательского интерфейса, присвоенного различным частям команды. В этом случае каждой sub команде принадлежит раскадровка, ограничивающая число членов команды, работающих над содержанием любой определенной раскадровки.
Вы купили или создали библиотеку, предопределяющую набор типов контроллера представления; содержание тех контроллеров представления определяется в раскадровке, предоставленной библиотекой.
У Вас есть содержание, которое должно быть выведено на экран на внешнем экране. В этом случае Вы могли бы сохранить все контроллеры представления связанными с альтернативным экраном в отдельной раскадровке. Альтернативный образец для того же сценария должен записать пользовательский переход.
Контейнеры автоматически инстанцируют своих дочерних элементов
Когда контейнер в раскадровке инстанцируют, ее дочерние элементы автоматически инстанцируют одновременно. Дочерние элементы нужно инстанцировать одновременно, чтобы дать контейнерному контроллеру некоторое содержание для отображения.
Точно так же, если дочерний элемент, который инстанцировали, является также контейнером, его дочерние элементы также инстанцируют, и т.д., пока больше отношений включения не может быть прослежено до новых контроллеров. При размещении контроллера содержания в контроллере навигации в контроллере панели вкладок когда панель вкладок инстанцируют, эти три контроллера одновременно инстанцируют.
Контейнер и его потомки инстанцируют, прежде чем Ваш контроллер представления вызывают для конфигурирования их. Ваш исходный контроллер представления (или делегат приложения) может полагаться на все дочерние элементы, которые инстанцируют. Это поведение инстанцирования важно, потому что Ваш код пользовательской конфигурации редко конфигурирует контейнер (ы). Вместо этого это конфигурирует контроллеры содержания, присоединенные к контейнеру.
Инстанцирование контроллера представления нераскадровки
Для создания контроллера представления программно без использования раскадровки Вы используете код Objective C, чтобы выделить и инициализировать контроллер представления. Вы не получаете ни одно из преимуществ раскадровок, подразумевая, что необходимо реализовать дополнительный код, чтобы сконфигурировать и вывести на экран новый контроллер представления.
Отображение представления содержание контроллера программно
Для содержания контроллера представления, чтобы быть полезным, это должно быть выведено на экран на экране. Существует несколько опций для отображения представления содержание контроллера:
Сделайте контроллер представления корневым контроллером представления окна.
Сделайте его дочерним элементом видимого контейнерного контроллера представления.
Представьте его от другого видимого контроллера представления.
Представьте его с помощью легкой сдобы (только iPad).
Во всех случаях Вы присваиваете контроллер представления другому объекту — в этом случае, окно, контроллер представления или контроллер легкой сдобы. Этот объект изменяет размеры представления контроллера представления и добавляет его к его собственной иерархии представления так, чтобы это могло быть выведено на экран.
Перечисление 2-4 показывает наиболее распространенный случай, который должен присвоить контроллер представления окну. Этот код предполагает, что раскадровка не используется, таким образом, это выполняет те же шаги, обычно выполняющиеся от Вашего имени операционной системой: Это создает окно и устанавливает новый контроллер как корневой контроллер представления. Тогда это делает окно видимым.
Перечисление 2-4 , Устанавливающее контроллер представления как корень окна, просматривает контроллер
- (void)applicationDidFinishLaunching:(UIApplication *)application { |
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; |
levelViewController = [[LevelViewController alloc] init]; |
window.rootViewController = levelViewController; |
[window makeKeyAndVisible]; |
} |