2010-09-02 35 views
2

J'ai une application basée sur un document simple qui crée simplement un fichier XML personnalisé. Il utilise une vue hiérarchique pour naviguer dans le document XML. Lorsqu'un élément de la vue hiérarchique est sélectionné, une vue personnalisée est affichée en tant que sous-vue de la vue de document, ce qui permet à l'utilisateur d'entrer des données. Sur l'une des vues a un NSTextField. Il a son ensemble de drapeaux "Allows Undo". J'ai testé pour s'assurer que le undoManager est appelé sur NSDocument lorsque l'édition est terminée. Ainsi, le contrôle semble rebondir à travers le premier répondant comme il se doit.Impossible d'enregistrer l'annulation à partir de NSTextField

Dans l'IBAction, j'utilise ActionName pour qu'il s'affiche correctement dans le menu. Maintenant, voici le problème. Non seulement le nom d'action n'est pas affiché dans le menu, mais le fait de cliquer sur Annuler n'inverse pas l'action effectuée sur le NSTextField mais l'action enregistrée juste avant. Y at-il quelque chose que j'ai oublié lors de la configuration de l'annulation avec NSTextField?

(IBAction) textFieldChanged: (id) sender {

... un code ici ...

[[self undoManager] setActionName: @ "du texte"];

}

Merci à l'avance, Rob

Répondre

1

est le champ de texte dans la même fenêtre que votre point de vue de contour (c.-à-fenêtre principale du document)? Si ce n'est pas le cas, vous devez définir un délégué pour cette fenêtre supplémentaire et répondre à -windowWillReturnUndoManager: en retournant le gestionnaire d'annulation du document. Parce que vous dites -undoManager est appelé contre votre document, je suppose que ce n'est pas le cas ci-dessus. Je n'ai jamais connu un champ de texte pour ne pas utiliser le gestionnaire d'annulation du document quand il est dans la fenêtre principale du document et permet d'annuler cette option. Avez-vous essayé quelque chose d'aussi simple que de supprimer le champ et de le recréer? Parfois, IB fait des choses étranges ... assez marrantes, ces problèmes ont tendance à apparaître lorsque vous annulez/refaites des changements dans Interface Builder lui-même. :-)

+0

Le champ de texte et la vue de plan se trouvent dans la même fenêtre mais sur les différents côtés d'une vue éclatée. Supprimer et remplacer le champ de texte n'a pas fonctionné. Savez-vous si le gestionnaire d'annulation est appelé avant que IBAction ne soit appelé dans un champ de texte? – Rob

+0

J'ai finalement réussi à le faire fonctionner. J'ai dû désactiver le "Autorise Annuler" dans IB, puis utiliser le délégué "- (BOOL) contrôle: (NSControl *) contrôle textShouldEndEditing: (NSText *) fieldEditor" et appelle la commande registerUndoWithTarget directement. – Rob