2017-08-22 1 views
0

J'ai ajouté un contrôleur de vue personnalisé au NSPrintPanel avec .addAccessoryController - cela fonctionne très bien. Je peux changer les propriétés et je vois qu'elles affectent la vue d'impression, mais seulement si je rafraîchis la vue en changeant le format ou la disposition du papier.Comment mettre à jour l'aperçu de NSPrintPanel?

il doit y avoir un moyen de dire au NSPrintPanel pour actualiser l'affichage d'impression, j'ai essayé .needsDisplay = true sans chance

Dans le documentation est une mention de la mise en œuvre keyPathsForValuesAffectingPreview, mais je n'ai pas pu comprendre que retourner là-bas.

Répondre

1

keyPathsForValuesAffectingPreview est implémentée de la même manière que toute autre méthode keyPathsForValuesAffecting<Foo> spécifiant des dépendances KVO, à l'exception qu'elle est déclarée sur une instance au lieu d'un type. Pour plus d'informations sur la déclaration des dépendances KVO, reportez-vous à cette page dans la documentation:

Fondamentalement, en un mot, vous voulez renvoyer un ensemble de chemins d'accès aux propriétés qui, lorsqu'elles sont modifiées, doivent modifier l'aperçu. . Dans Swift, il y a quelques mises en garde supplémentaires ne sont pas présents en Objective-C:

  1. Toutes les propriétés en question doit être marqué avec l'attribut @objc.

  2. Toutes les propriétés en question doit être KVO conforme, ce qui signifie essentiellement que:

    • Pour une propriété stockée, ajoutez le mot clé dynamic sur la déclaration de propriété.
    • Pour une propriété calculée foo, ajoutez une propriété keyPathsForValuesAffectingFoo statique répertoriant ses dépendances comme Set de String s.

À titre d'exemple, supposons que j'ai une propriété foo qui est une chaîne. J'ai aussi une propriété bar dont la valeur est dérivée de la valeur de foo. Si les modifications sont, nous souhaitons que l'aperçu change. Je voudrais écrire mon code comme ceci:

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

Si la propriété foo est modifié dans le scénario ci-dessus, les notifications KVO pour le chemin de clé foo seront envoyés, depuis foo est dynamique. Ensuite, les notifications KVO pour le chemin de clé bar seront envoyées, car bar dépend du chemin de clé foo. Cela, à son tour, entraînera la mise à jour de votre aperçu, car NSPrintPanel surveillera le chemin de clé bar que nous avons renvoyé à partir de keyPathsForValuesAffectingPreview.