接口构建器:它是否在绑定属性上建立了观察者关系?

时间:2015-10-11 11:28:23

标签: objective-c interface-builder xcode7

在我的一个xib中,我有标签绑定到我为文件所有者设置的表示对象的属性。表示的对象的类型为id,并由视图控制器手动更新。这与您在tableview中的单元格/视图非常相似,它可以很好地工作。

enter image description here

但是,在这种情况下,使用过的视图似乎不能识别对所表示对象的更改,即我可以更改整个对象或仅更改该值而没有任何视觉效果,我想知道为什么。对象检查器不是为绑定属性的标签建立观察者关系吗?

我试图显式发送willChangeValueForKey + didChangeValueForKey消息,但这没有帮助(这使我假设没有观察者,即使这应该是隐含的)。这有什么不对?

更新 也许这与xib / nib的加载方式有关,所以这就是代码:

FTSENT

难道我需要设置所有者吗?那是IB中称为“文件所有者”的值吗?但如果是这样,为什么它之前的测试属性呢?

1 个答案:

答案 0 :(得分:1)

当您致电nil时,您正在传递-[NSNib instantiateWithOwner:topLevelObjects:]作为NIB所有者。您在此处传递的所有者是填充文件所有者占位符所持有的位置的对象。由于您未指定所有者对象,因此没有对象填充该位置。在加载NIB时,实际上不会建立与文件所有者建立的连接。这包括从视图到文件所有者的视图绑定。

我建议您使用NSViewController或自定义子类来加载和拥有视图NIB。同样,我建议您使用NSWindowController或自定义子类加载并拥有一个窗口NIB。

作为一种特殊情况,当基于视图的表视图自动加载NIB以获取单元视图或行视图时,您可以预期文件的所有者将是表视图的委托。这对于连接文件的所有者非常有用。但是,对于来自文件所有者的连接,这没有用,因为同一个对象将是许多此类NIB的所有者,例如,出口无法连接到所有这些NIB中的子视图同时进行。

(从技术上讲,您的表格视图委托可以实施-tableView:viewForTableColumn:row:并与-makeViewWithIdentifier:owner:以外的所有者通话self。但请记住-makeViewWithIdentifier:owner:可以从表格中返回视图重用队列而不是加载NIB。如果它没有加载NIB,则不使用owner参数。因此,每次重用时都无法真正更改视图的所有者。而且你必须确保所有者的生活与视图一样长。)