2010-06-08 6 views

Répondre

6

Un NSTokenField est une sous-classe de NSTextField. Il n'y a pas de moyen facile et direct de manipuler directement la sélection de ces classes (à l'exception de -selectText :, qui sélectionne tout).

Pour ce faire, quand il devient le premier intervenant, vous aurez besoin de sous-classe NSTokenField (souvenez-vous de définir la classe du champ dans votre XI ter celle de votre sous-classe personnalisée) et passer outre -becomeFirstResponder comme ceci:

- (BOOL)becomeFirstResponder 
{ 
    if ([super becomeFirstResponder]) 
    { 
     // If super became first responder, we can get the 
     // field editor and manipulate its selection directly 
     NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self]; 
     [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)]; 
     return YES; 
    } 
    return NO; 
} 

Ce code cherche d'abord à voir si super répond "oui" (et devient le premier répondeur). Si c'est le cas, nous savons qu'il aura un éditeur de champ (une instance NSText), dont la sélection peut directement manipuler. Nous obtenons donc son éditeur de champs et définissons sa plage sélectionnée (je place le point d'insertion à la fin avec une plage {lastchar, nolength}).

Pour ce faire, lorsque le champ est fait édition (retour, sur la tabulation, etc.), de la correction -textDidEndEditing: comme ceci:

- (void)textDidEndEditing:(NSNotification *)aNotification 
{ 
    [super textDidEndEditing:aNotification]; 
    NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self]; 
    [fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)]; 
} 

Dans ce cas, lorsque l'utilisateur se termine l'édition, cette méthode permet de super faire sa chose, alors il regarde pour voir si c'est toujours le premier répondeur. Si c'est le cas, il fait la même chose que ci-dessus: met l'insertion carat à la fin du champ.

Notez que ce comportement n'est pas standard et inattendu. Utiliser avec modération.

+0

Merci Joshua, ça marche! Mais qu'en est-il du comportement lorsque vous appuyez sur ENTRÉE. Essayer de remplacer le 'keyDown:' ne fonctionne pas. Une idée pour désactiver ce comportement? – Robert

+0

J'ai mis à jour la réponse avec l'instruction -textDidEndEditing: case. Puisque les deux méthodes finissent par appeler la même chose, cela commence à ressembler à un travail de refactoring. Je voudrais sortir le code de l'éditeur de champ dans sa propre méthode (comme -adjustSelection) et l'appeler pour rendre le code plus lisible et moins répétitif. –

+0

Le cas textDidEndEditing: ne fonctionne pas correctement pour moi. Disons un ensemble le curseur de texte après le dernier jeton et ne commencez pas à taper n'importe quel caractère mais simplement cliquez sur RETOUR. Dans ce cas, tous les tags sont sélectionnés même si j'ai ajouté votre textDidEndEditing: proposition. Des idées pourquoi? – Robert

Questions connexes