如何将数组控制器绑定到NSDocument数组属性?
问题描述:
我想通过视图控制器找出将NSArrayController(依次绑定到表视图)绑定到NSDocument实例的NSArray属性的正确方法有困难。如何将数组控制器绑定到NSDocument数组属性?
我的NSDocument子类有一个属性NSArray * pages
。我首先在视图控制器中镜像了pages
属性,但这意味着当NSDocument将项目添加到其pages
数组时,表视图不会更新。在这种情况下强制更新的唯一方法是在视图控制器中的will..
/didChangeValueForKey:@"pages"
,但这种情况在视图控制器未触发更改时不实用。在NSDocument中直接调用will/didChangeValueForKey
不会触发阵列控制器更新。
我试图直接绑定到ViewController的document.pages
,但这似乎不起作用,或者至少不会显示任何更新。
什么是正确的技术在这里使用?
答
已解决 - 即使问题不在我寻找它的地方。
我阵列控制器结合这样创造了一个document
属性:
- (Document *)document {
return (Document *)self.view.window.windowController.document;
}
那是不行的,因为它不是志愿兼容。解决方案是简单地将NSDocument实例分配给self.representedObject
,这是一个“真实”属性,因此可以观察到。
包装更改为pages
数组willChangeValudForKey:
/didChangeValueForKey:
确实工作,以更新绑定的阵列控制器如预期,虽然Willeke在他的评论中提出的更为具体的版本可能是比较正确的。
您是否检查'pages'属性是否遵循[KVO Compliance]的规则(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/DOC/UID/20002178-BAJEAIEE)? – Willeke
由于NSDocument从NSObject继承,我认为它是KVO兼容的。 pages属性被定义为'@property(nonatomic,strong)NSMutableArray * pages;' - 据我所知,这应该是所有必需的,对吧? – fbitterlich
如果你做'self.pages = someArray'是的,如果你做'[self.pages addObject:someObject]'否。你必须使用'mutableArrayValueForKey:'或'willChange:valuesAtIndexes:forKey:'/'didChange:valuesAtIndexes:forKey:'。 – Willeke