2011-06-22 68 views
1

我有一個iOS應用程序,我想以編程方式創建一個ViewController。AppDelegate如何實例化?

我開始一個空XCode項目和修改的主要方法,所以它看起來像這樣

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>一個子類。

我的問題是我從未調用過MyAppDelegate_iPad中覆蓋的applicationDidFinishLoading方法(第一行的斷點從未命中)。該方法是這樣的

-(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文件中的榫文件行(我用來獲取默認的白色屏幕「我的iPad上的通用應用程序」),現在將顯示全部爲一個黑色的屏幕。 applicationDidFinishLoading仍未被調用。

我做錯了什麼?我應該如何正確地創建我的AppDelegate實例?

+0

假設這是一個樣本,你可以發佈它嗎? –

+0

@Deepak這不是樣本。我基於另一個SO問題http://stackoverflow.com/questions/809898,但否則它是通用應用程序的基本XCode空項目。 –

回答

1

有一個主要的nib文件可以引導你的應用程序。此筆尖文件在Info.plist文件中的NSMainNibFile項下引用,並應包含與您的應用程序委託類對應的對象(在Interface Builder中設置屬性)。此應用程序委託對象由文件所有者佔位符上的代理插座引用。

所以如果我理解正確的話,應用程序加載器會加載主要的nib文件,並將它自己設置爲nib所有者。它的delegate屬性被設置爲應用程序委託類的新實例,因此加載器知道在哪裏分派各種應用程序生命週期事件回調。

Cocoa with Love上有一篇關於Cocoa應用程序啓動的精彩博文。

+0

我實際上試圖以編程方式做所有事情,而不是爲我的用戶界面使用nib文件。這是可能的還是我需要一個筆尖? –

+0

@pwny:您始終可以創建一個只能創建應用程序委託的自舉筆尖。從那裏開始,你可以在代碼中做所有事情。 – zoul

0

如果您正在進行通用化,則不需要兩個不同的應用程序委託類。看到這link(我的答案),它可能會幫助你做出通用的應用程序。

+0

雖然通用應用程序模板XCode爲您創建了兩個不同的AppDelegates。任何理由? –