Interface builder:它是否在绑定属性上建立观察者关系?
Interface builder: does it establish an observer relationship on bound properties?
在我的一个 xib 中,我将标签绑定到我为文件所有者设置的表示对象的属性。表示的对象是 id 类型,由视图控制器手动更新。这与您在表视图中为 cells/views 所做的非常相似,它工作得很好。
但是,在这种情况下,使用的视图似乎无法识别对所表示对象的更改,即我可以更改整个对象或仅更改该值而没有任何视觉效果,我想知道为什么。 object inspector 不是给 label 和 bound 建立观察者关系吗属性?
我试图显式发送 willChangeValueForKey + didChangeValueForKey 消息,但这没有帮助(这让我假设没有观察者,尽管这应该是隐含的)。这里有什么问题?
更新
也许这与 xib/nib 的加载方式有关,所以这是代码:
NSNib *cellNib = [[NSNib alloc] initWithNibNamed: nibName bundle: bundle];
NSArray *objects = nil;
[cellNib instantiateWithOwner: nil topLevelObjects: &objects];
难道我需要设置一个所有者?那是IB中称为"File's Owner"的值吗?但如果是这样,为什么它与之前的测试 属性 一起工作?
您在调用 -[NSNib instantiateWithOwner:topLevelObjects:]
时将 nil
作为 NIB 所有者传递。您在此处传递的所有者是填充文件所有者占位符所在位置的对象。由于您没有指定所有者对象,因此没有对象填充该位置。 None 与文件所有者建立的连接或从文件所有者建立的连接将在加载 NIB 时实际建立。这包括从视图到文件所有者或通过文件所有者的绑定。
我建议您使用 NSViewController
或自定义子类来加载和拥有视图 NIB。同样,我建议您使用 NSWindowController
或自定义子类来加载和拥有 window NIB。
作为一种特殊情况,当基于视图的 table 视图自动加载 NIB 以获取单元格视图或行视图时,您可以预期文件所有者将是 table 视图的代表。这对于 到 文件所有者的连接很有用。但是,对于 from File's Owner 的连接,这没有用,因为同一个对象将是许多此类 NIB 的所有者,例如,插座不能连接到子视图所有这些同时进行。
(从技术上讲,您的 table 视图委托可以实现 -tableView:viewForTableColumn:row:
并使用 [=16= 以外的所有者调用 -makeViewWithIdentifier:owner:
。但请记住 -makeViewWithIdentifier:owner:
可以return 来自 table 重用队列的视图,而不是加载 NIB。如果它不加载 NIB,则不使用 owner 参数。因此,您无法真正更改每次重复使用视图的所有者。并且您必须确保所有者与视图一样长。)
在我的一个 xib 中,我将标签绑定到我为文件所有者设置的表示对象的属性。表示的对象是 id 类型,由视图控制器手动更新。这与您在表视图中为 cells/views 所做的非常相似,它工作得很好。
但是,在这种情况下,使用的视图似乎无法识别对所表示对象的更改,即我可以更改整个对象或仅更改该值而没有任何视觉效果,我想知道为什么。 object inspector 不是给 label 和 bound 建立观察者关系吗属性?
我试图显式发送 willChangeValueForKey + didChangeValueForKey 消息,但这没有帮助(这让我假设没有观察者,尽管这应该是隐含的)。这里有什么问题?
更新 也许这与 xib/nib 的加载方式有关,所以这是代码:
NSNib *cellNib = [[NSNib alloc] initWithNibNamed: nibName bundle: bundle];
NSArray *objects = nil;
[cellNib instantiateWithOwner: nil topLevelObjects: &objects];
难道我需要设置一个所有者?那是IB中称为"File's Owner"的值吗?但如果是这样,为什么它与之前的测试 属性 一起工作?
您在调用 -[NSNib instantiateWithOwner:topLevelObjects:]
时将 nil
作为 NIB 所有者传递。您在此处传递的所有者是填充文件所有者占位符所在位置的对象。由于您没有指定所有者对象,因此没有对象填充该位置。 None 与文件所有者建立的连接或从文件所有者建立的连接将在加载 NIB 时实际建立。这包括从视图到文件所有者或通过文件所有者的绑定。
我建议您使用 NSViewController
或自定义子类来加载和拥有视图 NIB。同样,我建议您使用 NSWindowController
或自定义子类来加载和拥有 window NIB。
作为一种特殊情况,当基于视图的 table 视图自动加载 NIB 以获取单元格视图或行视图时,您可以预期文件所有者将是 table 视图的代表。这对于 到 文件所有者的连接很有用。但是,对于 from File's Owner 的连接,这没有用,因为同一个对象将是许多此类 NIB 的所有者,例如,插座不能连接到子视图所有这些同时进行。
(从技术上讲,您的 table 视图委托可以实现 -tableView:viewForTableColumn:row:
并使用 [=16= 以外的所有者调用 -makeViewWithIdentifier:owner:
。但请记住 -makeViewWithIdentifier:owner:
可以return 来自 table 重用队列的视图,而不是加载 NIB。如果它不加载 NIB,则不使用 owner 参数。因此,您无法真正更改每次重复使用视图的所有者。并且您必须确保所有者与视图一样长。)