如何更新NSPrintPanel的预览?

时间:2017-08-22 18:45:26

标签: swift cocoa

我使用/home/teammate/my-projects/Alpha/DM/向NSPrintPanel添加了一个自定义视图控制器 - 这很好用。 我可以更改属性,但我发现它们会影响打印视图,但前提是我通过更改纸张格式或布局来刷新视图。

必须有办法告诉.addAccessoryController刷新打印视图,我试过.needsDisplay = true没有运气

documentation中提及实施NSPrintPanel,但我无法确定是否会返回那里。

1 个答案:

答案 0 :(得分:2)

keyPathsForValuesAffectingPreview的实现方式与指定KVO依赖关系的任何其他keyPathsForValuesAffecting<Foo>方法的实现方式相同,只是它在实例上而不是在类型上声明。有关声明KVO依赖关系的更多信息,请参阅文档中的此页面:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVODependentKeys.html

基本上,简而言之,您希望返回一组属性的关键路径,当这些属性发生更改时,应该会导致预览发生变化。在Swift中,Objective-C中还有一些额外的警告:

  1. 所有相关媒体资源必须使用@objc属性进行标记。

  2. 所涉及的所有属性必须符合KVO,这实际上意味着:

    • 对于存储的属性,请在属性声明中添加dynamic关键字。
    • 对于计算属性foo,添加一个静态keyPathsForValuesAffectingFoo属性,将其依赖关系列为Set的{​​{1}}。
  3. 例如,假设我有一个属性String,它是一个String。我还有一个属性foo,其值来自bar的值。如果foo发生更改,我希望更改预览。我会写这样的代码:

    bar

    如果在上面的方案中更改了@objc dynamic var foo: String = "Foo" @objc static let keyPathsForValuesAffectingBar: Set<String> = [#keyPath(foo)] @objc var bar: String { return self.foo } func keyPathsForValuesAffectingPreview() -> Set<String> { return [#keyPath(bar)] } 属性,则会发送foo密钥路径的KVO通知,因为foo是动态的。接下来,将发送foo密钥路径的KVO通知,因为bar依赖于bar密钥路径。反过来,这会导致您的预览更新,因为NSPrintPanel将会关注我们从foo返回的bar密钥路径。