2013-06-15 4 views
1

Я пишу пользовательский контроллер контейнера, который программным образом создает экземпляр контроллера детского представления и нескольких видов. Кроме того, контроллер детского представления программным образом создает представление, которое я вручную добавляю в иерархию представлений контейнера с помощью addSubview.viewDidLoad против loadView для пользовательских контроллеров контейнеров

Мой вопрос в том, где в коде моего контроллера контейнера я создаю экземпляр как моего контроллера детского вида, так и представлений, управляемых контроллером контейнера?

Я знаю, что loadView - это то место, где вы должны создавать свою иерархию представлений при выполнении программно, но мне нужно добавить представление дочернего контроллера в иерархию представлений. Поскольку представление дочернего контроллера создается при создании дочернего контроллера, это означает, что мне нужно сначала создать дочерний контроллер. Итак, тогда я создаю дочерний контроллер в loadView, а затем добавлю его представление в иерархию представлений? Это кажется неправильным.

В настоящее время я создаю контроллер детского представления в viewDidLoad, а затем добавляю его представление в иерархию представлений, которое работает, но я везде читал, что вся иерархия должна быть построена в loadView. Каков правильный способ справиться с этим?

ответ

0

Попробуйте этот подход:

С учетом нагрузки установить некоторые контейнеры следующим образом:

(В этом примере создается меню навигации по основному содержанию, что вы можете провести, чтобы открыть).

- (void)loadView 
{ 
    CGRect fullScreen = [UIScreen mainScreen].bounds; 
    CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; 
    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, statusBarFrame.size.height, fullScreen.size.width, 
      fullScreen.size.height - statusBarFrame.size.height)]; 
    [self.view setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth]; 

    _mainNavigationContainer = 
      [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - 60, self.view.frame.size.height)]; 

    [_mainNavigationContainer setHidden:YES]; 
    [self.view addSubview:_mainNavigationContainer]; 

    _mainContentViewContainer = [[GGMainContentContainer alloc] initWithFrame:self.view.bounds]; 
    [_mainContentViewContainer setNavigationDelegate:self]; 
    [self.view addSubview:_mainContentViewContainer]; 

} 

Сделав это, создать метод, чтобы принять контроллер ребенка (ы)

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

Код:

- (void)setMainNavigationController:(UIViewController*)mainNavigationController 
{ 
    _mainNavigationController = mainNavigationController; 
    [_mainNavigationController.view setFrame:_mainNavigationContainer.bounds]; 
    [_mainNavigationController willMoveToParentViewController:self]; 
    [_mainNavigationContainer addSubview:_mainNavigationController.view]; 
    [_mainNavigationController didMoveToParentViewController:self]; 
} 

Вот пример анимации главного контейнера во время выполнения

- (void)pushViewController:(UIViewController*)viewController replaceRoot:(BOOL)replaceRoot 
{ 
    if ([_controllerStack peek] == nil) 
    { 
     [_controllerStack push:viewController]; 
     [_mainContentViewContainer setContent:viewController.view navigationBarOrNil:[self makeNavigationBarForTopController]]; 
    } 
    else 
    { 
     if (replaceRoot) 
     { 
      [_controllerStack removeAllObjects]; 
     } 
     [self slideToViewController:viewController direction:GGSlideAnimationDirectionFromRight]; 
    } 
} 

Вот несколько слайдов и образец, которые могут помочь:

https://speakerdeck.com/peterfriese/ios-5-uiviewcontroller-containment