J'ai un L'utilisateur peut maintenant sélectionner une entrée à partir de la liste d'achèvement automatique par ex. Maintenant si l'utilisateur commence à saisir certaines touches (les suggestions sont donc affichées), puis frappez onglet kbd> au lieu d'entrer le jeton avec la valeur du texte d'achèvement Curieusement la méthode de déléguée Nstokenfield code> qui permet à l'utilisateur de sélectionner des contacts (comme dans mail.app). Donc, le NSTExtField est lié à un tableau dans mon variable d'instance code> d'instance. p>
Joe Bloggs: joe@blogs.com dès qu'il frappe entrez kbd> le jeton (joe bloggs) code> est affiché et modèle. Les destinataires CODE> contiennent maintenant un BBContact code>. p>
(Joe Bloggs: Joe @ bloggs.com) code> est créé et le Nstokenfieldelegate code> n'a pas été appelé, afin que je puisse répondre à cet événement. La saisie Model.Recipient Code> contient maintenant un Nstring code> au lieu d'un BBContact code> entrée. P>
Tokenfield: DéputationddAbjects: AttinDex: Code> N'EST PAS appelé, c'est ce à quoi je m'attendrais lorsque l'utilisateur onglets du champ de jeton. P>
p>
3 Réponses :
Cela pourrait être dû au fait que la touche "Entrée" peut envoyer l'événement du champ de jeton à son action dans laquelle la touche "Tab" ajoute simplement du texte. Vous pouvez essayer de définir la propriété-croisinissue sur Oui et voyez si vous obtenez les résultats souhaités. P>
Cela semblait prometteur alors je l'ai vite essayé, mais le problème persiste, j'ai donc toujours le même comportement.
Je l'ai travaillé maintenant en utilisant le rachat code> iSValidObject code>
onglet Appuyez sur l'onglet Appels ISVALIDOBJECT sur le délégué, alors retournez NO pour Nstokenfield. Toutefois, vous souhaitez revenir oui s'il n'y a pas de caractères alphanumériques, sinon l'utilisateur ne sera pas capable de se concentrer sur le champ (la chaîne contient invisible Les caractères Unicode basés sur le nombre de jetons existent)
La mise en œuvre moins fragile que je pourrais proposer est la suivante: p>
J'ai pu résoudre le problème avec les suggestions de @ Valexa. En cas de flou avec onglet code> code> Je dois passer à toutes les entrées et rechercher mes objets de contact pour toutes les chaînes.
- (BOOL)control:(NSControl *)control isValidObject:(id)token{
if ([control isKindOfClass:[NSTokenField class]] && [token isKindOfClass:[NSString class]])
{
NSTokenField *tf = (NSTokenField *)control;
if ([token rangeOfCharacterFromSet:[NSCharacterSet alphanumericCharacterSet]].location == NSNotFound){
return YES;
} else {
// We get here if the user Tabs away with an entry "pre-selected"
NSMutableArray *set = @[].mutableCopy;
for(NSObject *entry in tf.objectValue){
GSContact *c;
if([entry isKindOfClass:GSContact.class]){
c = (GSContact *)entry;
}
if([entry isKindOfClass:NSString.class]){
NSString *number = [[(NSString *)entry stringByReplacingOccurrencesOfString:@">" withString:@""]
componentsSeparatedByString:@"<"][1];
c = [self findContactByNumber:number];
}
if(c) [set addObject:c];
}
[control setObjectValue:set];
}
}
return YES;
}
Et vous attribuez votre mise en œuvre spécifique de ma solution les points de réponse à cette question? Je pense que cela pourrait être contre les règles de Stackoverflow.