代码之家  ›  专栏  ›  技术社区  ›  Jed Smith

-在子类UIViewController中未调用viewDidLoad

  •  9
  • Jed Smith  · 技术社区  · 15 年前

    对我耐心点,我还在学习触摸。其他-viewDidLoad未被称为问题与我的问题无关,我进行了搜索。

    我有 FooViewController UIViewController Main ,其应用程序代理是 MyApplication 文件的所有者是谁 UIApplication . 我的主笔尖设置为Main。

    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的文档视图中显示实例等的Cocoa教程,但我没有看到这些选项。我应该在Nib中实例化fooViewController吗?我错过了转机吗?在FooViewController.xib中,文件的所有者视图连接到Nib中的视图。

    我相信这是一个简单的解决方案,我走错了路。停!

    3 回复  |  直到 15 年前
        1
  •  20
  •   Tyler    15 年前

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

    viewDidLoad 方法应在之后立即调用 loadView 负荷视图 viewDidLoad

    在某些情况下,SDK将为您处理此行为。假设您有一个子类 UIViewController 打电话 MyViewController ; 然后:

    • myViewController.view 在你打电话之前 负荷视图 ,则超类访问器足够智能,可以调用 负荷视图 给你,还有 viewDidLoad 紧接着。

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

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

    然后两者 负荷视图 viewDidLoad 我会代表你来的。

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

    然后 view getter可以看到您已经加载了视图,并且它假定您也调用了 viewDidLoad viewDidLoad 从接到电话。

        2
  •  4
  •   Casebash    14 年前

    awakeFromNib 在超类中调用自己。

        3
  •  3
  •   Jed Smith    15 年前

    我已经回答了我自己的问题,所以这可能会帮助未来的人们。既然我看到viewDidLoad,正如我在谷歌上建议的那样,“viewDidLoad未被调用”、“viewDidLoad未被调用”和“viewDidLoad未开火”,我想这是一个常见的错误。。。

    改变:

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

    致:

    fooViewController = [[FooViewController alloc] initWithNibName:@"FooViewController" bundle:[NSBundle mainBundle]];
    

    解决了这个问题。很明显,我使用可可粉的方法是错误的。