2011-04-02 98 views
0

我有一個兩個Windows應用程序。第一個是默認窗口。第二個是使用定製控制器創建:可可控制器問題

CCCVentanaBloqueo *ctrl = [[CCCVentanaBloqueo alloc] initWithWindowNibName:@"VentanaBloqueo"]; 
CCWVentanaBloqueo *ventana = (CCWVentanaBloqueo*)[ctrl window]; 

塔納包含經由的XCode IB連接到一個CCCVentanaBloqueo控制器出口一個標籤。如果我嘗試通過CCCVentanaBloqueo控制器插座從主窗口嘗試兩次修改該出口,則不會成功。

我可以看到,outlet有零價值。我還可以看到,當[ctrl窗口]行被執行時,兩個對象被創建(兩個調用awakeFromNib函數)CCCVentanaBloqueo

我想* ctrl引用錯誤的控制器,但我不知道爲什麼兩個控制器被創建。

你知道爲什麼嗎?從主窗口控制器更改不主窗口的任何其他方式?

回答

0

聲明第二個窗口控制器作爲您的應用程序控制器的實例變量並將其設置爲屬性。然後,您可以通過appDelegate輕鬆地將消息發送給它的IBOutlets(假設它們也是屬性)。

假設你要有窗口發送窗口B消息。在窗口A的控制器,你可能有這樣的方法:

- (IBAction)messageWindowB:(id)sender { 

     myAppDelegate *appDelegate = [NSApplication sharedApplication] delegate]; 
     [appDelegate.windowB.theView doSomething]; 

} 

老實說,我不知道我是否完全瞭解你的問題。此外,這是一個快速和骯髒的方法。所以如果任何人有建議,請成爲我的客人!

+0

使用應用程序委託和文件所有者之間的區別是什麼? – LooPer 2011-04-03 16:32:07

+1

文件的所有者是代理對象,通常代表您選擇加載NIB的控制器。主窗口文件的所有者是NSApplication,它實際上並不關心應用程序中的消息委託(儘管它擁有appDelegate,它具有)。另一方面,appDelegate位於應用程序的頂部,用於將消息委託給應用程序的各個組件。 – 2011-04-04 00:08:48

+1

在標準的可可應用程序模板中,主窗口有一個appDelegate對象,這意味着由於主窗口將與應用程序的幾乎所有組件交互,因此可能需要訪問最高級別的消息委派。因此,在這種情況下,您將聲明第二個窗口的控制器爲appDelegate的實例變量和屬性,以便您可以在需要時始終發送消息。 – 2011-04-04 00:10:05