7
votes

Nstokenfield ne vérifie pas le jeton sur flou

J'ai un Nstokenfield 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 d'instance.

L'utilisateur peut maintenant sélectionner une entrée à partir de la liste d'achèvement automatique par ex. Joe Bloggs: joe@blogs.com entrez le jeton (joe bloggs) est affiché et modèle. Les destinataires contiennent maintenant un BBContact .

Maintenant si l'utilisateur commence à saisir certaines touches (les suggestions sont donc affichées), puis frappez onglet au lieu d'entrer le jeton avec la valeur du texte d'achèvement (Joe Bloggs: Joe @ bloggs.com) est créé et le Nstokenfieldelegate n'a pas été appelé, afin que je puisse répondre à cet événement. La saisie Model.Recipient contient maintenant un Nstring au lieu d'un BBContact entrée.

Curieusement la méthode de déléguée Tokenfield: DéputationddAbjects: AttinDex: N'EST PAS appelé, c'est ce à quoi je m'attendrais lorsque l'utilisateur onglets du champ de jeton.

Entrez la description de l'image ici


0 commentaires

3 Réponses :


-1
votes

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.


2 commentaires

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 iSValidObject



6
votes

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: xxx


0 commentaires

0
votes

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;
}


1 commentaires

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.