【问题标题】:How do I access the view of a Window from interfacebuilder?如何从 interfacebuilder 访问 Window 的视图?
【发布时间】:2012-07-10 03:23:41
【问题描述】:

我正在尝试在 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]];

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

【问题讨论】:

    标签: objective-c xcode cocoa interface-builder


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 2018-11-14
        • 2011-09-29
        • 2016-06-28
        • 2021-08-08
        • 1970-01-01
        相关资源
        最近更新 更多