2010-02-11 144 views
1

的main.m爲什麼applicationWillFinishLaunching在我的NSApplicationDelegate類中永遠不會被調用?

#import <Cocoa/Cocoa.h> 

int main(int argc, char *argv[]) 
{ 
    return NSApplicationMain(argc, (const char **) argv); 
} 

CoolClass.h

#import <Cocoa/Cocoa.h> 

@interface CoolClass : NSObject <NSApplicationDelegate> { 

} 
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification; 
@end 

CoolClass.m

#import "CoolClass.h" 

@implementation CoolClass 
- (void) applicationDidFinishLaunching : (NSNotification *) aNotification { 
    NSLog(@"THIS SHOULD BE PRINTED TO THE DEBUG CONSOLE"); 
} 

@end 

我試圖與 「applicationWillFinishLaunching」 爲好,但仍然沒有運氣。任何幫助都將不勝感激。謝謝。

回答

4

你錯過了什麼是採用協議使得那種CoolClass的對象準備用作任何的NSApplication對象的代表(前提是你在聲明貫徹和落實所需的所有協議的方法)。聲明與協議的一致性還可以防止在將類的實例設置爲應用程序的委託時出現編譯器警告。

但是,對於特定的應用程序對象(比如說,Cocoa爲您創建的共享NSApplication對象)知道要將協議中的消息發送到特定的CoolClass對象,您必須將要接收這些消息的對象設置爲特定應用程序對象的委託。

這意思是,你要接收將被應用程序發送的消息前一段時間,有什麼需要實例化一個CoolClass對象 - 稱之爲c - 並告訴該應用程序,「嘿,你的委託是c過在這裏,從現在開始,把委託消息發送給小販。「

那是什麼歸結爲是該應用程序完成啓動前的幾行代碼必須執行:

CoolClass *c = [[CoolClass alloc] init]; 
[[NSApplication sharedApplication] setDelegate:c]; 

最簡單的方法有這種事情發生,就是讓界面生成器做的工作適合你:讓正如其他人所建議的,MainMenu nib實例化CoolClass,並在加載nib時將酷類對象設置爲應用程序的委託。

爲此,請打開MainMenu.xib。將自定義對象拖到xib中,並將其類更改爲檢查器中的CoolClass。按住Ctrl鍵(或右鍵單擊拖動)從xib中的應用程序對象到CoolClass對象,然後選擇「委託」。保存,構建並運行。

6

你應該定義在Interface Builder(從App實例按Ctrl +拖動到CoolClass實例

+3

或者,您可以在'CoolClass'的'-init'方法中調用'[NSApp setDelegate:self]',如果您想以編程方式執行。 – 2010-02-11 09:36:21

+0

啊,剛剛看到上面的評論。我會嘗試。 – demonslayer319 2010-02-11 09:36:51

+0

我現在有: CoolClass.m #進口 「CoolClass.h」 @implementation CoolClass - (無效)INIT { [NSApp表示setDelegate:自]; NSLog(@「這應該打印到調試控制檯」); } @end 但它仍然不會運行。我也修改了CoolClass.h來反映這一點。 我對上述答案感到困惑。我該拖什麼,在哪裏? – demonslayer319 2010-02-11 09:41:28

1

applicationDidFinishLaunchingCoolClass作爲應用程序委託是一個實例方法,而不是一個類方法。也就是說,你需要一個實例你的應用程序需要知道你的實例,並知道它應該向它發送委託消息。最簡單也是最常用的方法來實現這一點是...

首先,您將實例化您的CoolClass。在Interface Builder中打開您的應用程序的MainMenu.nib文件。拖動一個「Object 「(它看起來像一個藍色的立方體)出庫窗口。選擇它並使用檢查器的標識選項卡將其類從NSObject更改爲CoolClass。現在,你有一個CoolClass的實例。

現在,您將該實例設置爲應用程序的委託。從「應用程序」(仍在界面生成器中)控制拖動到CoolClass的新實例。將彈出一個窗口(顯示可連接到您的對象的應用程序的出口)。選擇「委託」。現在,您的應用程序將CoolClass集的一個實例設置爲其代理,因此,您的applicationDidFinishLaunching將運行。

+0

如果您採用並且未實現'-applicationDidFinishLaunching'(帶有選擇器@selector(applicationDidFinishLaunching)的實例方法),但是如果您實現了'+ applicationDidFinishLaunching'(帶有選擇器@選擇器(applicationDidFinishLaunching))並將類本身設置爲應用程序的委託('[[NSApplication sharedApplication] setDelegate:[CoolClass class]]'),應用程序對象將把消息發送給CoolClass本身。 – 2010-02-13 01:36:32

0

我很欣賞你可能試圖從頭學習,但你爲什麼不使用XCode模板創建一個新項目?它爲你設置所有這一切。生活涉及足夠的調試,而無需添加更多頂層!

0

要從開始處開始:您撥打NSApplicationMain應撥打NSAutoreleasePool。如果你不這樣做,你會遇到麻煩。

相關問題