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 文件中对象的多个实例的主要内容,如果未能解决你的问题,请参考以下文章
nsobject 控制器跨两个 nib (xib) 文件链接。声明 nib 实例化