【问题标题】:How to bind an array controller to a NSDocument array property?如何将数组控制器绑定到 NSDocument 数组属性?
【发布时间】:2017-04-26 14:34:55
【问题描述】:

我无法找到通过视图控制器将 NSArrayController(反过来由表视图绑定)绑定到 NSDocument 实例的 NSArray 属性的正确方法。

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

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

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

【问题讨论】:

  • 你检查pages属性是否遵循KVO Compliance的规则?
  • 由于 NSDocument 继承自 NSObject,我认为它是 KVO 兼容的。 pages 属性定义为@property (nonatomic, strong) NSMutableArray *pages; - 据我了解,这应该是所需要的,对吧?
  • 如果你这样做 self.pages = someArray 是,如果你这样做 [self.pages addObject:someObject] 否。您必须使用mutableArrayValueForKey:willChange:valuesAtIndexes:forKey:/didChange:valuesAtIndexes:forKey:

标签: objective-c cocoa-bindings nsarraycontroller nsdocument


【解决方案1】:

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

我将数组控制器绑定到一个 document 属性,创建如下:

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

这不起作用,因为它不兼容 KVO。解决方案是简单地将 NSDocument 实例分配给self.representedObject,这是一个“真实”属性,因此是可观察的。

pages 数组的更改包装到 willChangeValudForKey: / didChangeValueForKey: 确实可以按预期更新绑定的数组控制器,尽管 Willeke 在他的评论中建议的更具体的版本可能更正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2016-01-31
    • 2016-11-19
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多