我正在尝试在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]];
但这也不起作用。谢谢你的阅读。
答案 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中,将这些出口从“文件所有者”连接到您需要它们的确切视图。