2009-12-23 78 views
3

我有一個AppController類,它以通常的方式在我的應用程序中查看/控制。目標C類之間的通信

有沒有在IB我的應用程序的主窗口,導致AppController中實例化一個新的窗口控制器(accountPanelController),並表明輔助窗口上的按鈕:

- (IBAction) showAccountPanel:(id) sender 
{ 
    //Is accountController nil? 
    if (!accountPanelController) { 
     accountPanelController = [[AccountPanelController alloc] init]; 
    } 

    [accountPanelController showWindow:self]; 
} 

當新的窗口與做的,我想從我的輔助窗口控制器收集到的數據發送到方法的AppController:

- (IBAction) close: (id) sender 
{ 
    NSLog(@"Close detected"); 
    [AppController addAccount:0]; 
    [self close]; 
} 

然而,當我嘗試和新的窗口控制器調用AppController中的addAccount方法,我得到一個「‘AppController的’可能不響應到'+ addAccount'「警告。

這似乎與AppController是一個類而不是對象實例化有關,因爲AppController中的方法稱爲-addAccount(而不是在警告中報告的+ addAccount)。事實上,如果我將目標方法的名稱更改爲+ addAccount而不是-addAccount,則不會顯示警告(但程序在執行時會崩潰)。

鑑於我實際上並沒有自己實例化AppController(我猜這在NIB啓動過程中會以某種方式發生),有沒有人有任何想法可以將數據發送到AppController方法?通知看起來像是矯枉過正...

非常感謝。

回答

4

我建議在蘋果的Mac開發中心下面的介紹文章:Communicate with Objects - #Notifications
更新
我指着鏈接到相關的錨(通知)。

代碼示例中的問題是,您調用了一個類方法(帶有+),但是實現了一個實例方法( - )。
因此,一個簡單的修復方法是獲取AppController(可能在您的代碼中爲self)的(共享)實例並將其發送給addAccount:消息。
但我鼓勵你先閱讀文章。

也許你可以通過向你的控制器發送一個通知(NSNotification)來解決你的問題。

更新:
你另一個有趣的閱讀可能是this SO question regarding the difference between class methods and instance methods

+0

非常感謝。我讀了所有的鏈接。 根是AppController是一個類,我沒有實例化,但IBuilder指向(IBAction)s。所以我沒有辦法指向AppController在實例化時生成的實例。 通知工作。有一種更簡單的方法嗎?即使Hillegass在他的章節中使用通知。人們必須從許多應用程序的二進制窗口獲取數據,所以這一定是常見的? 我對共享實例不熟悉,並且很難查找某些文檔。你知道有任何可能的幫助嗎?如下所示,我嘗試了[self addAccount]沒有運氣。 再次感謝。 – 2009-12-24 20:02:10

+0

您可能可以使用[NSApplication sharedApplication],它是應用程序委託的共享實例。但我認爲使用通知是在這裏做的正確的事情。 – 2009-12-25 10:14:39

+0

今天得到的通知沒有問題。謝謝。 – 2009-12-30 01:37:39

1

只是提供一個intiWithOtherController方法,並將其添加herre:

accountPanelController = [[AccountPanelController alloc] initWithOtherController:self]; 

剛及格的自我,所以你需要的東西是這樣的:

(AccountPanelController *) initWithOtherController:(OtherController *) 

現在你有一個指向otherController,你可以做:

[otherController addAccount:0] 
+0

得到了這個工作。很好很簡單。謝謝。 一旦initWithOtherController返回,只有hitch以某種方式保持otherController指針,以便我可以在Window的close方法中使用它。 – 2009-12-30 01:36:57