nsobject 控制器跨两个 nib (xib) 文件链接。声明 nib 实例化

Posted

技术标签:

【中文标题】nsobject 控制器跨两个 nib (xib) 文件链接。声明 nib 实例化【英文标题】:nsobject controller linked across two nib (xib) files. declaring nib instantiation 【发布时间】:2013-06-01 20:38:06 【问题描述】:

Apple 的资源编程指南 (RPG) 指出“最好将组件分布在多个 nib 文件中。”...

因此, 我有一个关联窗口笔尖(笔尖 2),它有一个 nsobjectcontroller,需要链接(选择自我)到主文档窗口笔尖(笔尖 1)中的 nsarraycontroller。

我需要共享一个公共实例(nib 1 中的 nsarraycontroller 或 nib2 中的 nsobjectcontroller)。我可以在 Nib 1 中添加一个自定义对象,并将 File's Owner 设置为该类型的自定义对象。但是,每个 nib 都会实例化自己的实例。

有没有一种方法可以设置对象被实例化的 nib,或者声明一个外部引用。

我还“让文件的所有者成为 nib 文件之外任何内容的单一联系人”(RPG)。这是一个 NSWindowController。

提前致谢。

【问题讨论】:

【参考方案1】:

您可能想让 NIB1 的所有者负责实例化 NIB2。这将允许它成为两个 NIB 的所有者。在常见的情况下,它可能看起来像这样:

// In the interface...
@property (nonatomic, readwrite, retain) NSArray* nib2TopLevelObjects;

// In the implementation...
- (void)awakeFromNib

    NSNib* nib2 = [[[NSNib alloc] initWithNibNamed: @"NIB2" bundle: [NSBundle mainBundle]] autorelease];
    NSArray* tlo = nil;
    [nib2 instantiateWithOwner: self topLevelObjects: &tlo];
    self.nib2TopLevelObjects = [tlo retain];

    // Do other stuff...


- (void)dealloc

    [_nib2TopLevelObjects release];
    [super dealloc];

最后,NIB2 将被实例化为 NIB1 的所有者作为它的所有者,并且 NIB2 将其对象插入共享所有者(确保不要将东西插入两个 NIB 的同一个插座。)

说了这么多,我不确定这一定是在这里使用的正确模式。如果这些窗口都是同一个文档上的视图,您可能应该为每个窗口创建一个 NSWindowController 子类并覆盖-[NSDocument makeWindowControllers] 以实例化它们。 (NSWindowController 将是每个 NIB 的“文件所有者”。)让文档 NIB 的所有者成为 NSDocument 子类是简单情况下的“捷径”。一旦你需要多个窗口,NSWindowControllers 就是你要走的路。

每个 NSWindowController 都可以通过-document 返回文档,并且 NSDocument 子类可以协调不同 NSWindowController 之间的状态。这是一种更简洁的方法,并且避免了所有带有破坏 IBOutlets 等的恶作剧。

对于您的具体情况,我可以看到在 NSDocument 子类上有一个类似 sharedArrayController 的属性,该属性在 -makeWindowControllers 期间从 NIB1 获取 NSArrayController,并重新出售它。然后,您可以通过绑定到 File's Owner > document.sharedArrayController.selection 从 NIB2 访问它。

【讨论】:

以上是关于nsobject 控制器跨两个 nib (xib) 文件链接。声明 nib 实例化的主要内容,如果未能解决你的问题,请参考以下文章

iphone+相同的xib用于不同的班级

强制 Nib loader 使用 init?(with:) for custom subclass of NSObject in iOS

NSObject 用 nib 加载 UIView 但文件所有者是 UIViewController

并加载 NIB / XIB 文件?

为啥这段代码不能加载我的 NIB/XIB

奇怪的 xib 文件到 nib 转换问题