XIB 文件中对象的多个实例

Posted

技术标签:

【中文标题】XIB 文件中对象的多个实例【英文标题】:Multiple instances of an object inside a XIB file 【发布时间】:2013-01-18 16:30:45 【问题描述】:

我有一个基于文档的应用程序,具有推荐的 NSDocument / NSWindowController 设置。每个窗口都有自己的NSWindowController 实例和关联的XIB 文件。界面在-(id)init:if (self = [super initWithWindowNibName:@"DocumentWindow"]) // yadda yadda 中非常直接地加载。 XIB 文件包含一个对象,该对象代表一个单独的控制器,每次用户打开新窗口时都应实例化该控制器。它显示仅与当前文档相关的数据。当我用-(id)initWithWindowNibName: 解压缩对象时,尽管有两个不同的窗口控制器并且尽管调用了两次-(id)initWithWindowNibName:,但我总是得到对同一个实例的引用。 XIB 加载机制似乎只对同一个归档对象进行一次解压(真的吗?)。

除了在代码中分配单独的对象,手动加载视图,计算它们的大小,将它们添加为子视图,然后设置绑定并注意在窗口关闭时手动解除绑定之外,没有其他办法了吗?

因为我自己的愚蠢,我正用头撞墙。它只会让事情变得更糟。

【问题讨论】:

您确定有问题的对象实际上在 XIB 中,而不是“文件所有者”(实际上不在 XIB 中)。 该问题与XIB加载机制完全无关,请参阅下面的答案。 【参考方案1】:

正如我最初认为的那样,我绝对走错了路。问题很简单,我在上述实例化类中为一个对象注册了一个通知,该对象是应用程序 keyWindow 的子视图(我将它一起破解并想稍后将其更改为一个属性,哎哟 )。加载应用程序时,所有文档窗口的所有实例都已注册,并且所有实例都会收到通知并计算相同的数据。

调试器是我今天最好的朋友。

当您从 XIB 中解压缩对象时,实际上没有什么比优化更好的了,而且您总是会得到不同的实例(回想起来这绝对是有意义的)。如果您遇到类似的问题,则可能是代码中其他地方的不相关错误。

【讨论】:

以上是关于XIB 文件中对象的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

多个控制器使用一个 xib

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

xib文件加载研究

单例模式实例

UINib (iOS):可以从一个 nib 文件中实例化多个视图吗?

NodeJS共享对象无需多次实例化