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 实例化的主要内容,如果未能解决你的问题,请参考以下文章
强制 Nib loader 使用 init?(with:) for custom subclass of NSObject in iOS