2010-05-19 28 views
4

Dans Cocoa, j'ai un NSOutlineView où les cellules sont NSTextFieldCell. La cellule affiche les valeurs qui sont des chaînes qui sont formatées selon certaines règles (telles que des flottants ou des paires de flottants avec un espace entre les deux). J'ai fait un NSFormatter personnalisé pour valider le texte, et cela semble fonctionner sans problème.Rendre NSFormatter valider NSTextFieldCell en continu

Cependant, la cellule (ou la vue générale, je ne sais pas de quoi il s'agit) semble seulement utiliser le formateur au moment où mon édition se terminerait. Si je tape des caractères alphabétiques dans le champ de texte (qui enfreint les règles de formatage), ces caractères s'affichent. La seule façon de remarquer que le formateur fait son travail est que je ne peux plus déplacer le focus clavier de cette cellule. Si je renvoie le contenu de la cellule à un formulaire valide, je peux déplacer le focus.

J'ai défini à la fois la cellule et la vue générale comme étant "continue".

Il serait mieux si je ne pouvais pas entrer de texte dans la cellule en premier lieu. Est-il possible de faire comme ça, et si oui, comment?

Répondre

7

Répondre à ma propre question parce que j'ai trouvé la solution. Il existe une méthode optionnelle pour surcharger NSFormatter, et cela résout le problème. La méthode est facultative:

- (BOOL) isPartialStringValid: (NSString*) partialString 
      newEditingString: (NSString**) newString 
      errorDescription: (NSString**) error 

Ici, on peut tout simplement revenir NO si le partialString est invalide. On peut retourner une chaîne fixe par référence en newString si on le souhaite.

Il existe une autre méthode qui pourrait également avoir été utilisé, mais il est plus complexe:

- (BOOL) isPartialStringValid: (NSString**) partialStringPtr 
     proposedSelectedRange: (NSRangePointer) proposedSelRangePtr 
       originalString: (NSString*) origString 
     originalSelectedRange: (NSRange) origSelRange 
      errorDescription: (NSString**) error