【问题标题】:viewDidLoad vs. loadView for custom container controllers自定义容器控制器的 viewDidLoad 与 loadView
【发布时间】:2013-06-12 06:59:40
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios view viewcontroller viewdidload loadview


    【解决方案1】:

    试试这个方法:

    在加载视图中设置一些容器如下:

    (此示例在主要内容下创建导航菜单,您可以滑动以显示)。

    - (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

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 2011-05-15
      • 2023-03-25
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2013-02-01
      相关资源
      最近更新 更多