如何从界面构建器访问窗口视图?

时间:2012-07-10 03:23:42

标签: objective-c xcode cocoa interface-builder

我正在尝试在xcode的界面构建器中为cocoa应用程序创建接口。我在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 = [[[controller window] contentView]];

但这也不起作用。谢谢你的阅读。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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中,将这些出口从“文件所有者”连接到您需要它们的确切视图。