2017-08-22 5 views
0

カスタム表示コントローラーをNSPrintPanelに.addAccessoryControllerで追加しました。これは問題なく動作します。 プロパティを変更することができ、用紙のフォーマットやレイアウトを変更してビューを更新する場合にのみ、プロパティが印刷ビューに影響することがわかります。NSPrintPanelのプレビューを更新するには?

印刷ビューをリフレッシュするためにNSPrintPanelを指示する方法がなければならない、私はdocumentationで運

ずに真.needsDisplay =を試してみましたkeyPathsForValuesAffectingPreviewを実装するの言及ですが、私はそれを把握することができませんでしたそこに戻る。

答えて

1

keyPathsForValuesAffectingPreviewは、KVO依存関係を指定する他の方法と同じ方法で実装されますが、例外ではなくインスタンス上で宣言されます。 https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVODependentKeys.html

基本的に一言で言えば、変更されたときにプレビューを変更する必要のある一連のキーパスをプロパティに戻したいとします。 。

  1. 問題の性質のすべてが@objc属性でマークされている必要がありますスウィフトでは、Objective-Cの中に存在していないいくつかの余分な注意点があります。

    • 保存されたプロパティについては、プロパティ宣言にdynamicキーワードを追加:
    • 問題の性質のすべて

      はKVO準拠、本質的ということでなければなりません。
    • 計算されたプロパティーfooの場合は、keyPathsForValuesAffectingFooという静的プロパティを追加し、その依存関係をSetとしてStringに追加します。例として

、私は文字列であるプロパティfooがあるとします。私はまた、値がfooから派生したプロパティbarを持っています。 barが変更された場合は、プレビューを変更する必要があります。 fooプロパティがfooは動的であるため、fooキーパスのKVO通知は、送信されます、上記のシナリオに変更された場合は

@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)] } 

:私はこのように私のコードを記述します。次に、barキーパスのKVO通知が送信されます。barfooキーパスに依存しているためです。 NSPrintPanelはkeyPathsForValuesAffectingPreviewから返されたbarキーパスを見ているため、プレビューが更新されます。