2014-04-25 31 views
0

所以我在這裏有點困惑。我有一個Cocoa應用程序,在appdelegate頭文件中,我聲明瞭一個在Interfacebuilder中連接的NSDrawer,並根據上下文以編程方式設置其contentView。內容視圖包含連接到Appdelegate中各種功能的按鈕。在NSApp委託上引用變量Cocoa

@property (strong) IBOutlet NSDrawer *theDrawer; 

當我的應用程序啓動應用程序,我檢查它在調試器「theDrawer」不是零和的InterfaceBuilder中正確實例。在

現在,如果用戶單擊任何按鈕,事實證明對[[NSApp委託] theDrawer]的引用將被忽略,因爲該Drawer是零。這對我沒有意義。我嘗試通過在應用啓動時專門設置委託來解決此問題。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    [NSApp setDelegate:self]; 
} 

我檢查過self.theDrawer不是零。但即使在我明確設置委託後,以後對[[NSApp委託] theDrawer]的任何調用都是零。

如何確保訪問我的應用程序委託上的變量?我的理解是,調用NSapp委託將返回一個獨特的應用程序實例。

看來,當用戶點擊一個按鈕,這將創建一個新的線程和NSApp委託將返回所有變量爲零。

任何幫助表示讚賞

+0

你不應該使用這個應用程序委託(這不是什麼類是在那裏)。添加一個帶有抽屜屬性斷點的setter,何時被調用? – Wain

+0

我應該在哪裏放置一個變量,我需要從應用程序的任何地方訪問?在主線程開始之後,setter被直接調用 –

+1

如果它是一個視圖類型對象,則在加載NIB的相關窗口或窗口控制器中聲明出口。 NSApplication和委託存在橋接應用程序和系統事件,而不是全局狀態桶。 – CodaFi

回答

1

申請委託在main在main.m文件,你會在該項目的「支持文件」文件夾中找到正確設置。通常它嵌入在NSApplicationMain()中,我相信在plist中引用NSMainNibFile,並且實際上具有主要的筆尖擁有應用程序委託對象實例。然而,蘋果並不完全清楚所有這些魔法是如何運作的。儘管如此,您不能在applicationDidFinishLaunching中設置代理 - 這是一個委託功能!

但是,如果你使用的是NSMainNibFile和非文檔應用程序,該應用程序委託有可能被設置爲在主NIB的對象......在NIB,「文件的所有者」是的應用程序委託類,而其他出口在[NSApp委託]內是非零的,因爲它是主要的NIB文件的所有者。從NSMainNibFile可以在App Delegate類創建插座,因爲它是文件的所有者。

如果您創建第二個NIB,則存在訪問委託的問題。你不想創建一個對象,因爲它與[NSApp委託]不是同一個對象。您可以使用應用程序佔位符對象並使用「application.delegate」的鍵路徑進行綁定。但是你不能創建網點,因爲應用程序委託不能成爲文件的所有者。

但是這是不相關的,因爲如果你有第二個NIB,你創建的插座,他們屬於你聲明的自定義viewcontroller或windowcontroller子類是該文件的所有者。即使第二個NIB被立即加載,那麼應用程序委託應該實例化一個控制器實例來加載和擁有NIB,如果你想要插座,它必須是一個自定義的子類。

Apple通過使應用程序委託類成爲非文檔應用程序中MainMenu.xib中主菜單「窗口」的所有者來打破此模式......但這是因爲菜單窗口有點特別。你在MainMenu.xib之外做的任何事情都需要一個定製控制器類來擁有插座。

Additional discussion in this answer關於應用程序委託實例。

+0

Hi @Stevesliva,感謝您的回答,我的問題是我在MainMenu.xib中完成了所有這些工作。我想要做的就是打開並關閉主窗口的抽屜。我爲該抽屜的內容分開了viewcontroller,但主抽屜是在MainMenu.xib中創建和管理的。根據我的理解,控制類(主應用程序委託)應該管理抽屜的行爲,創建類來顯示和隱藏抽屜。但是,如上所述,如果我tty調用主應用程序的一個實例,這個抽屜變量是零,我不明白爲什麼。 –

+0

好吧,只要閱讀你提到的問題,那實際上完全符合我的問題。所以我會將你的答案標記爲解決方案。謝謝 –

+0

那個答案也是我的。由於某種原因,這種在腳下射擊自己的方式沒有很好的記錄,但是在幾個星期內我就自己的答案做了迴應,它在計算器上出現了兩次。 S.O.標準響應是關於委託中屬於什麼的講座,但XCode設置MainMenu.xib的方式實質上混淆了問題,並且存在特殊的處理以確保Delegate對象與NSApp委託相同。在其他任何地方嘗試,你會感到沮喪。你*應該*避免代表擁有網點,但知道他們爲什麼是零也很重要。 – stevesliva