2010-06-30 6 views
5

J'ai besoin de modifier le comportement de UiTextField pour pouvoir insérer par programme des astérisques et déplacer le curseur au début de la chaîne; J'ai essayé le « coller » truc (http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html), mais le curseur est déplacé à la fin l'effet que je tente de réaliser est comme ceci:. Au début:Déplacer le curseur par programmation dans UiTextField


alors les caractères d'insertion utilisateur f ***** **** fo *** foo etc ...

Est-ce possible ou les réglages que je l'ai à faire ne méritent pas l'effort?

Thanx

-G-

Répondre

7

MISE À JOUR:

Dans iOS5 et plus il est possible de le faire, car conformes à UITextInput protocole UITextField et UITextView. S'il vous plaît jeter un oeil à ceci: "Can I select a specific block of text in a UITextField?" pour un exemple :).

Hope it helps


RÉPONSE VIEUX: (iOS4.x et ci-dessous):

Il n'y a aucun moyen d'y arriver en utilisant les API publiques (Pas que je sache). Cependant, j'ai trouvé deux méthodes privées: (méthodes peut-être sans papiers parce qu'ils n'ont pas le préfixe underscore que les méthodes privées ont généralement)

selectionRange 
setSelectionRange: 

Ci-dessous fin de travail de code (au moins dans le simulateur 4.3) et J'utilise KVC pour éviter les avertissements gênants. (self est une instance d'une sous-classe de UITextField)

- (void) moveToRight{ 

    NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue]; 
    if (selectedRange.location != NSNotFound) { 
     if (selectedRange.length > 0) { 
      selectedRange.location = NSMaxRange(selectedRange); 
      selectedRange.length = 0; 
     }else if (selectedRange.location < self.text.length) { 
      selectedRange.location += 1; 
     } 
     [self setValue:[NSValue valueWithRange:selectedRange] forKey:@"selectionRange"]; 
    } 
} 
- (void) moveToLeft{ 

    NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue]; 
    if (selectedRange.location != NSNotFound) { 
     if (selectedRange.length > 0) { 
      selectedRange.length = 0; 
     }else if (selectedRange.location > 0) { 
      selectedRange.location -= 1; 
     } 
     [self setValue:[NSValue valueWithRange:selectedRange] forKey:@"selectionRange"]; 
    } 
} 

Puisque ce ne sont pas des API publiques, utilisez à vos propres risques, je ne sais pas s'ils vont passer l'examen d'Apple.

BTW: Je les ai trouvés en utilisant:

#import "/usr/include/objc/objc-runtime.h" 

unsigned int methodCount = 0; 
Method *mlist = class_copyMethodList([UITextField class], &methodCount); 
for (int i = 0; i < methodCount; ++i){ 
    NSLog(@"%@", NSStringFromSelector(method_getName(mlist[i]))); 
} 
+0

Très agréable. Merci d'avoir partagé cela. – DenVog

Questions connexes