2009-01-14 9 views
2

J'ai remplacé un NSTextField avec un NSTokenField afin que je puisse effectuer une auto-complétion. La valeur du NSTextField était liée à un attribut NSString d'une classe de contrôleur. Maintenant que j'ai changé le NSTextField en un NSTokenField la valeur a changé en NSArray.Comment faire pour que la liaison de valeur de NSTokenField fournisse un NSString?

Comment puis-je faire la valeur NSTokenField obligatoire doit être un NSString?

La modification de la valeur d'un NSString en un NSArray semble être une mauvaise conception OO. Je pense qu'une sous-classe devrait pouvoir remplacer une superclasse sans aucune modification à la sous-classe.

Répondre

1

valeur de NSTokenField liant accepte une NSString ou NSNumber obligatoire, pas un NSArray. Comment avez-vous déterminé qu'il veut un NSArray?

+4

je crois que la documentation est erronée: [mon radar sur la question] (http://openradar.appspot.com/11226270). –

4

Si tout ce que vous voulez est autocomplétion, et non tokenization, vous pouvez le faire en utilisant une NSTextField simple et la mise en œuvre de la méthode déléguée: (. Cette méthode est en fait déclaré dans NSControl, superclasse de NSTextField)

- (NSArray *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index 

Si vous voulez avoir tokenization, vous devrez fournir un NSArray pour la valeur de l'objet à afficher dans le champ symbolique. Comme expliqué dans the NSTokenField programming guide, le tableau que vous fournissez sera un mélange de chaînes et d'objets. Les chaînes seront affichées telles quelles et tout objet non-chaîne sera affiché comme des jetons dans le champ de jeton. Vous devez implémenter les différentes méthodes de délégué NSTokenField pour fournir une chaîne à afficher pour chaque objet représenté dans votre tableau.

Il semble que la Cocoa Bindings Reference indique que l'objet lié à la valeur d'un NSTokenField doit être une chaîne ou un nombre, mais dans mon expérience, ce qui est faux, et doit être lié le champ symbolique à un NSArray, tout comme lors de l'utilisation setObjectValue:

0

La meilleure façon de le faire (comme Cocoafan souligné) est d'utiliser Value Transformers. Les transformateurs de valeur vous permettent de convertir le type d'objet utilisé dans votre modèle en un type adapté à une vue. Voici un transformateur String/Array très simple qui vous permet de stocker vos données sous la forme d'une chaîne séparée par des virgules, mais qui les convertira en un tableau de chaînes.

@interface StringArrayTransformer: NSValueTransformer {} 
@end 

@implementation StringArrayTransformer 

+ (Class)transformedValueClass { return [NSString class]; } 

+ (BOOL)allowsReverseTransformation { return YES; } 

- (id)transformedValue:(id)value { 
    NSString *string = (NSString*) value; 
    return [string componentsSeparatedByString:@", "]; 
} 

-(id)reverseTransformedValue:(id)value { 
    NSArray *array = (NSArray*)value; 
    return [array componentsJoinedByString:@", "]; 
} 
@end 

Si vous utilisez des liaisons pour votre NSTokenField puis utiliser ce transformateur sélectionnez simplement le NSTokenField dans Interface Builder, puis dans l'inspecteur Manchettes sur le côté droit, pour la valeur de liaison, définissez la « valeur Transformer "à StringArrayTransformer comme ci-dessous.

Setting the Value Transformer Binding for NSTokenField