2010-10-31 4 views
1

Je travaille avec un NSTextView et ai un ensemble de délégué pour sa propriété -textStorage. À la réception de -textStorageDidProcessEditing: j'ai besoin d'appliquer des attributs à des parties du texte.Cocoa: NSTextStorageDelegate a NSLayoutManager obsolète?

Mes attributs sont appliqués, mais ils sont toujours appliqués au texte avant j'ai fait le modifier, même si je suis en invoquant les méthodes de NSLayoutManager pas de -will... mais did....

Il est comme si le gestionnaire de mise en page ne connaît pas la récente insertion glyphe/suppression à ce stade de l'exécution, donc je suppose NSTextView/NSTextStorage appelle la méthode délégué puis informe le gestionnaire de mise en page de mise à jour.

Existe-t-il un moyen de forcer le gestionnaire de mise en page à mettre à jour avec effet immédiat pour que cela fonctionne? Je connais la (les) méthode (s) NSTextStorage-addAttribute:value:range: de NSTextStorage et j'utilise celles-ci avec succès jusqu'à présent, mais j'ai atteint un point où je dois maintenant le faire via le gestionnaire de disposition plutôt que dans le cadre de un exercice de refactoring/optimisation.

Répondre

1

J'ai trouvé une solution à ce problème. Si vous vous enregistrez en tant que délégué pour les notifications -textStorageDidProcessEditing: de NSTextStorage et -didInvalidateLayout: de NSLayoutManager, vous pouvez effectivement mettre en file d'attente une opération du délégué de stockage de texte, qui ne s'exécutera qu'une fois que le délégué du gestionnaire de disposition aura reçu une notification indiquant qu'il peut le faire.