2017-04-26 97 views
0

我想通过视图控制器找出将NSArrayController(依次绑定到表视图)绑定到NSDocument实例的NSArray属性的正确方法有困难。如何将数组控制器绑定到NSDocument数组属性?

我的NSDocument子类有一个属性NSArray * pages。我首先在视图控制器中镜像了pages属性,但这意味着当NSDocument将项目添加到其pages数组时,表视图不会更新。在这种情况下强制更新的唯一方法是在视图控制器中的will../didChangeValueForKey:@"pages",但这种情况在视图控制器未触发更改时不实用。在NSDocument中直接调用will/didChangeValueForKey不会触发阵列控制器更新。

我试图直接绑定到ViewController的document.pages,但这似乎不起作用,或者至少不会显示任何更新。

什么是正确的技术在这里使用?

+0

您是否检查'pages'属性是否遵循[KVO Compliance]的规则(https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/DOC/UID/20002178-BAJEAIEE)? – Willeke

+0

由于NSDocument从NSObject继承,我认为它是KVO兼容的。 pages属性被定义为'@property(nonatomic,strong)NSMutableArray * pages;' - 据我所知,这应该是所有必需的,对吧? – fbitterlich

+0

如果你做'self.pages = someArray'是的,如果你做'[self.pages addObject:someObject]'否。你必须使用'mutableArrayValueForKey:'或'willChange:valuesAtIndexes:forKey:'/'didChange:valuesAtIndexes:forKey:'。 – Willeke

回答

0

已解决 - 即使问题不在我寻找它的地方。

我阵列控制器结合这样创造了一个document属性:

- (Document *)document { 
    return (Document *)self.view.window.windowController.document; 
} 

那是不行的,因为它不是志愿兼容。解决方案是简单地将NSDocument实例分配给self.representedObject,这是一个“真实”属性,因此可以观察到。

包装更改为pages数组willChangeValudForKey:/didChangeValueForKey:确实工作,以更新绑定的阵列控制器如预期,虽然Willeke在他的评论中提出的更为具体的版本可能是比较正确的。

相关问题