ios - 对于完全以编程方式创建的 UIView/UIViewController,loadView 与 viewDidLoad 中应该包含什么?

标签 ios objective-c uikit

出于实验目的,我正在尝试一些完全在代码中的东西。

我有一个自定义根 UIView/UIViewController 子类对,分别称为 RootView 和 RootViewController。

我还有一个名为 RenderView 和 RenderViewController 的 GLKView/GLKViewController 子类对。

两个 UIViewController 子类都在它们的 loadView 覆盖中创建它们的托管 View 。

设置主 RootViewController/RootView 很简单。在我的 AppDelegate 子类中,我创建了主窗口并像这样分配 rootViewController proeprty ...

#import "AppDelegate.h"
#import "RootViewController.h"

@implementation AppDelegate

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        CGRect screenBounds = [[UIScreen mainScreen] bounds];

     // Set up the window
        UIWindow* mainWindow = [[UIWindow alloc] initWithFrame:screenBounds];
        mainWindow.rootViewController = [RootViewController new];
        self.window = mainWindow;

        [mainWindow makeKeyAndVisible];

        return YES;
    }

@end

RootView 完全按照预期出现在屏幕上。

然而,我想知道的是关于 View 层次结构的初始化。 RootViewController 有一个属性来保存 RenderViewController 的实例,并且它的 RenderView 将(最初)放置在框架中,该框架存储在 RootViewController 的第二个属性中,称为 renderViewFrame。

我的问题是设置该层次结构的合适位置在哪里?

文档说明这正是 UIViewControllerloadView 的用途,所以这就是我在那里所做的...

- (void)loadView
{
    self.view = [[RootView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

 // Set up the RenderViewController
    RenderViewController* renderViewController = [RenderViewController new];
    [self addChildViewController:renderViewController];

    renderViewController.view.frame = self.renderViewFrame;
    [self.view addSubview:renderViewController.view];

    self.renderViewController = renderViewController;
}

...它有效,但我看到有些人说不,我应该将与创建 RenderView/RenderViewController 相关的所有内容移动到 RootViewController 的 viewDidLoad 而不是 loadView ,但没有人能说出为什么。我的意思是它是层次结构的一部分,这正是 loadView 的用途。

如果我是对的,那么如果我们已经在 loadView 中进行初始化,那么我/任何人为什么还需要使用 viewDidLoad,或者仅仅是当内存可以在 iOS6 中一直卸载 View 时的神器?

最佳答案

Apples 文档实际上说只是在 loadView 上加载 View 而不做任何其他事情,然后

If you want to perform any additional initialization of your views, do so in the viewDidLoad method.

从技术上讲,这两种方法都可以工作,它只是关于分离关注点并将逻辑放在最有意义和预期被发现的地方。

如果该方法是 loadViewHierarchy 则请穿上 Boot 。在 99.9999...% 的所有应用程序中,额外的 View 将被添加(在 NIB 中或)在 viewDidLoad 中。

关于ios - 对于完全以编程方式创建的 UIView/UIViewController,loadView 与 viewDidLoad 中应该包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579090/

相关文章:

c# - iOS 上的 Xamarin Forms,调试元素变为 null

ios - 呈现 View Controller 时状态恢复不起作用?

ios - 如何将视频从 ALAsset 显示到 UICollectionview ios

objective-c - 为控制台应用程序设置非常基本的单元测试时出现 "Undefined symbols for architecture x86_64"

ios - 在第二行导航栏添加段 Controller

objective-c - 没有子类化 UIView 或 UIViewController : possible to catch if a subview was added?

ios - 可拖动的 UIView 在添加到 UIScrollView 后停止发布 touchesBegan

objective-c - 是否可以在 Objective-C 中将 -init 方法设为私有(private)?

ios - 弃用 : 'sendAsynchronousRequest:queue:completionHandler:' in iOS9

ios - 如何在 UICollectionViewController 中重写 collectionView