AppDelegate是如何实现的?

时间:2011-06-22 07:27:34

标签: objective-c ios cocoa-touch

我有一个iOS应用程序,我想以编程方式创建一个ViewController。

我启动了一个空的XCode项目并修改了main方法,所以它看起来像这样

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"MyAppDelegate_iPad");
    [pool release];
    return retVal;
}

该应用是一个通用应用,MyAppDelegate_iPadMyAppDelegate的子类,是NSObject <UIApplicationDelegate>的子类。

我的问题是我在applicationDidFinishLoading覆盖的MyAppDelegate_iPad方法永远不会被调用(第一行的断点永远不会命中)。该方法看起来像这样

-(void) applicationDidFinishLaunching:(UIApplication *)application {
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    if(!window)
    {
        [self release];
        return;
    }
    window.backgroundColor = [UIColor whiteColor];

    rootController = [[MyViewController alloc] init];

    [window addSubview:rootController.view];
    [window makeKeyAndVisible];
    [window layoutSubviews];
}

我删除了从我的plist文件链接到nib文件的行(我曾经获得默认的“我在iPad上的我的通用应用程序”白屏),现在所有显示的都是黑屏。 applicationDidFinishLoading仍未被调用。

我做错了吗?我该如何正确创建AppDelegate实例?

2 个答案:

答案 0 :(得分:1)

有一个主要的nib文件可以引导您的应用程序。此nib文件在NSMainNibFile项下的Info.plist文件中引用,并且应包含与应用程序委托类对应的对象(在Interface Builder中设置 Class 属性)。此应用程序委托对象由文件所有者占位符上的委托出口引用。

因此,如果我理解正确,应用程序加载器将加载主nib文件,将其自身设置为nib所有者。它的delegate属性被设置为应用程序委托类的新实例,因此加载器知道在哪里分派各种应用程序生命周期事件回调。

Cocoa with Love上有关于Cocoa应用程序启动的博客文章很棒。

答案 1 :(得分:0)

如果您正在普及,则不需要两个不同的应用委托类。看到这个link(我的回答),它可以帮助你制作通用应用程序。