viewDidLoad与loadView的自定义容器控制器

时间:2013-06-15 22:47:33

标签: ios view viewcontroller viewdidload loadview

我正在编写一个自定义容器控制器,它以编程方式实例化子视图控制器和多个视图。此外,子视图控制器以编程方式实例化一个视图,然后我使用addSubview手动将其添加到容器的视图层次结构中。

我的问题是我的容器控制器的代码在哪里实例化我的子视图控制器和由容器控制器直接控制的视图?

我知道loadView是您在以编程方式执行操作时应该创建视图层次结构的地方,但我需要将子控制器的视图添加到视图层次结构中。由于在创建子控制器时实例化子控制器的视图,这意味着我需要首先创建子控制器。那么我在loadView中创建子控制器,然后将其视图添加到视图层次结构中?这似乎不对。

现在我一直在viewDidLoad中创建子视图控制器,然后将其视图添加到视图层次结构中,这是有效的,但我已经读到了应该在loadView中构建整个层次结构的所有地方。处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分: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