Как использовать несколько пользовательских контроллеров представления iOS без контроллера навигации
Я создаю приложение, которое использует несколько типов экранов - все, которые требуют своих собственных контроллеров представления. Я успешно переключаюсь между контроллерами представления и их связанными представлениями, переназначая основной window
"s rootViewController
с помощью метода в моем приложении делегата, как показано ниже:
- (void)changeRootViewController:(NSString *)controllerName
{
if (controllerName == @"book") {
rootViewController = (UIViewController *)[[BookViewController alloc] init];
[self.window setRootViewController:rootViewController];
} else if (controllerName == @"something_else") {
// Use a different VC as roowViewController
}
}
Однако то, как я это делаю, не может быть лучшей практикой. Я не хочу использовать UINavigationController
или UITabBarController
как rootViewController
, или. Это неправильный способ сделать это, и если да, то как я должен подходить к этому по-другому?
Я думал, что это было бы где-то покрыто, но (я чувствую, как будто) Я погуглил черт из него, искал связанные вопросы и т.д. Извините, если я что-то пропустил!
2 ответа
Это не плохое решение. Вы в основном устанавливаете одно представление как корневое представление. Когда вам нужен еще один UIViewController, вы устанавливаете еще один. Просто будьте осторожны с утечками...
- Создайте rootViewController как свойство класса с помощью retain.
- До этого:
rootViewController = (UIViewController *) [[BookViewController alloc] init];
Добавь это:
if(rootViewController){
self.rootViewController=nil;
}
}
Итак, вы выпускаете предыдущий.
Редактировать 1: Одно: мое объяснение здесь основано на том факте, что вы не хотите использовать UINavigationController.
Одним из отличных способов сделать это является использование в iOS5+ возможности UIViewController иметь дочерние UIViewControllers (это называется сдерживанием контроллера представления). Мне, конечно, было трудно понять, как это сделать, пока я не посмотрел видео WWDC, которое объясняет это в деталях.
В двух словах, он позволяет вам создать свой собственный родительский контроллер представления, которому принадлежит серия дочерних контроллеров представления. Этот единственный родительский контроллер представления может (и, вероятно, должен, если вы не делаете действительно причудливых вещей:P) сидеть в качестве корневого контроллера представления вашего приложения. Этот метод наличия единственного контроллера представления действует как родительский (и облегчает добавление, удаление и переход дочерних контроллеров представления) напоминает то, что делает UINavigationController (который является намерением Apple). Теперь вы можете создать свой собственный UINavigationController-подобный родительский контроллер представления, но иметь совершенно разные анимации перехода и пользовательский интерфейс.
В качестве примера, в родительском контроллере представления в viewDidLoad я добавляю первый дочерний контроллер следующим образом:
self.currentlyDisplayedChildViewController = [[TheFirstViewController alloc] init];
[self addChildViewController:self.currentlyDisplayedChildViewController];
[self.view addSubview:self.currentlyDisplayedChildViewController.view];
[self.currentlyDisplayedChildViewController didMoveToParentViewController:self];
Тогда у меня будет функция для перехода к следующему дочернему контроллеру представления (ПРИМЕЧАНИЕ: эта функция принадлежит родительскому контроллеру представления - контроллеру представления, который будет действовать как ваш UINavigationController):
- (void)transitionToViewController:(UIViewController *)nextChildViewController
{
[self addChildViewController:nextChildViewController];
__weak TheParentViewController *me = self;
[self transitionFromViewController:self.currentlyDisplayedChildViewController
toViewController:nextChildViewController
duration:1.0f
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:nil
completion:^(BOOL finished)
{
[nextChildViewController didMoveToParentViewController:self];
[me.currentlyDisplayedChildViewController willMoveToParentViewController:nil];
[me.currentlyDisplayedChildViewController removeFromParentViewController];
me.currentlyDisplayedChildViewController = nextChildViewController;
}];
}
Одна вещь, которая действительно хороша, это то, что вы можете использовать все стандартные параметры UIViewAnimationTransition (или определить свою собственную пользовательскую анимацию в блоке анимации. Кроме того, любые события вращения ориентации автоматически перенаправляются из контроллера родительского представления в контроллеры дочернего представления. Это было одним из таких самые большие проблемы с выполнением пользовательских манипуляций с контроллером корневого представления самостоятельно.
Я бы посоветовал взглянуть на видео WWDC2011 под названием "Внедрение UIViewController Containment".