1

我正在尝试在 xcode 的界面构建器中为可可应用程序制作界面。我在 Interface builder 中创建的一个窗口的视图依赖于来自另一个视图的数据,因此有必要从必须传递数据的类中向该视图发送消息。但是,我似乎找不到从 nib 文件的所有者那里获取此视图对象的引用的方法。这里大致是我正在使用的代码:

controller = [[NSWindowController alloc] initWithWindowNibName:@"Somenibname"];
[[controller window] display];
theOtherView = [[[[controller window] contentView] subviews] objectAtIndex:1];
[theOtherView setObjectwhichneedstobemessaged:self];
[theOtherView sendAMessage:self];

此代码所在的对象永远不会收到消息。最初我实际上认为 contentview 是出现在界面生成器中的视图,并试图像这样获取对它的引用

theOtherView = [[[控制器窗口] contentView]];

但这也没有用。谢谢阅读。

4

2 回答 2

1

听起来您可能需要更好地了解 View-Controller 结构如何与 nib 文件一起使用,并且如果没有更多代码/细节,很难确切知道您要做什么,但是解决问题的快速方法可能是使用NSNotification 而不是试图定位另一个视图并通过调用链发起消息发送。

您可以注册以处理来自接收视图的通知并从发起视图发送通知(如果您需要两种方式,反之亦然)。

于 2012-07-10T03:45:35.443 回答
1

阅读IBOutlet并考虑直接从 Interface Builder 链接您需要的视图。

例如,您的NSWindowController子类可能具有:

@interface MyWindowController : NSWindowController
{
  /* can also use more specific classes if you need them, e.g. NSButton if it's really an NSButton */
  IBOutlet NSView* firstViewIWant;
  IBOutlet NSView* secondViewIWant;
}
  . . .
@end

您的实现可能有:

- (void)
windowDidLoad
{
  [super windowDidLoad];
  /* make sure the views were connected properly */
  assert(nil != firstViewIWant);
  assert(nil != secondViewIWant);
    . . .
}

然后在 Interface Builder 中,将这些插座从“文件所有者”连接到您需要它们的确切视图。

于 2012-07-10T04:13:02.917 回答