Как использовать несколько пользовательских контроллеров представления iOS без контроллера навигации - PullRequest
8 голосов
/ 25 июля 2011

Я создаю приложение, которое использует несколько типов экранов - все из которых требуют своих собственных контроллеров представления. Я успешно переключаюсь между контроллерами представления и их связанными представлениями, переназначая main 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 ]

10 голосов
/ 15 декабря 2012

Один отличный способ сделать это - использовать UIViewController из iOS5 +, чтобы иметь дочерние 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 под названием "Implementin".g UIViewController Containment ".

3 голосов
/ 25 июля 2011

Это не плохое решение. Вы в основном устанавливаете одно представление как корневое представление. Когда вам нужен еще один UIViewController, вы устанавливаете другой. Только будь осторожен с утечками ...

  • Создайте rootViewController как свойство класса с сохранением.
  • До этого:

rootViewController = (UIViewController *) [[BookViewController alloc] INIT];

Добавить это:

if(rootViewController){
    self.rootViewController=nil;
}

}

Итак, вы отпускаете предыдущий.

Редактировать 1. Одно: мое объяснение здесь основано на том факте, что вы не хотите использовать UINavigationController.

...