iphone - -viewDidLoad 未在子类 UIViewController 中调用

标签 iphone objective-c cocoa-touch

请耐心等待,我仍在学习 Cocoa Touch。其他 -viewDidLoad not being called 问题与我的问题无关,我进行了搜索。

我有 FooViewController,一个 UIViewController 子类。 FooViewController.xib 的文件所有者设置为 FooViewController。此外,我还有 Main,它的 App Delegate 是 MyApplication,它的 File's Owner 是 UIApplication。我的主要 Nib 设置为 Main。

我能够使 View 出现在屏幕上,使用这个流程(为简洁起见,代码被剪掉):

UIWindow *main;

-(void)applicationDidFinishLaunching:(UIApplication*)application {
    [self showFooViewController];
    [main makeKeyAndVisible];
}

-(void)showFooViewController {
    fooViewController = [[FooViewController alloc] init];
    if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) {
        DebugF(@"Failed to load FooViewController");
        return;
    }

    // Add the view and put it in place
    UIView *view = [fooViewController view];
    CGRect cur = [view frame];
    cur.origin = CGPointMake(0.0f, 20.0f);
    [view setFrame:cur];

    [main addSubview:[fooViewController view]];
}

但是,此消息未发送到 FooViewController:

- (void) viewDidLoad {
    DebugF(@"Hello!");
}

gdb 的输出中完全没有声音。

我看过其他在 IB 文档 View 中显示实例等的 Cocoa 教程,但我没有在我的文档中看到这些选项。我应该在 Nib 中实例化 fooViewController 吗?我错过了连接吗?在 FooViewController.xib 中,文件的所有者 View 连接到 Nib 中的 View 。

我确信这是一个简单的解决方案,但我走错了路。住手!

最佳答案

我没有找到支持以下内容的文档,但这是我通过实验/经验推断的:

viewDidLoad 方法应该在 loadView 被调用后立即被调用,并且由调用 loadView 的人来提供额外的调用viewDidLoad.

在某些情况下,SDK 会为您处理此行为。假设您有一个名为 MyViewControllerUIViewController 子类;然后:

  • 如果您在调用 loadView 之前访问 myViewController.view,那么父类(super class)访问器足够智能,可以为您调用 loadView,并且 viewDidLoad 紧随其后。

因此,如果您的代码如下所示:

MyViewController *myViewController = [[MyViewController alloc] init];
[superView addSubview:myViewController.view];  // Calls viewDidLoad.

然后 loadViewviewDidLoad 都将代表您调用。

但是,如果您的代码如下所示:

MyViewController *myViewController = [[MyViewController alloc] init];
[myViewController loadView];
[superView addSubview:myViewController.view];  // Doesn't call viewDidLoad.

然后 view getter 可以看到您已经加载了 View ,并且它假设您也调用了 viewDidLoad - 所以它不会调用任何一个。具有讽刺意味的是,此处的额外函数调用阻止了 viewDidLoad 被调用。

关于iphone - -viewDidLoad 未在子类 UIViewController 中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479576/

相关文章:

objective-c - 将 plist 数据读入 NSArray 但得到 null

iphone - iOS:是否可以使 UINavigationBar 更高,并使屏幕下方的其他 View 为 "push"?

iphone - 在一个选项卡栏项目内切换 Controller

iphone - 如何在 iPhone 上创建多按钮确认?

iphone - 如何从 iOS 设置包启动 URL?

ios - 当用户在我的应用程序中按下联系号码时如何获取电话号码并在电话拨号盘中显示该号码

ios - NSMutableURLRequest 将 '+' 替换为空格

objective-c - UIwebview 中的 UIActivity 指示器

ios - 从 UIPickerView 中删除未选择的项目

iPhone sdk位置变更通知