2011-04-02 86 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