Posso selezionare un blocco di testo specifico in un UITextField?

Ho un UITextField nella mia app per iPhone. So come rendere il campo di testo selezionare tutto il suo testo, ma come può cambiare la selezione? Dire che volevo selezionare gli ultimi 5 caratteri o uno specifico intervallo di caratteri, è ansible? in caso contrario, posso spostare le linee che segnano l’inizio e la fine della selezione, come se l’utente le stesse trascinando?

Con UITextField, non puoi. Ma se vedi le intestazioni, hai _selectedRange e altre che potrebbero essere usate se aggiungi alcune categorie ad esso;)

Aggiornamento per iOS5 e versioni successive:

Ora UITextField e UITextView sono conformi al protocollo UITextInput quindi è ansible 🙂

Selezionare gli ultimi 5 caratteri prima del punto di inserimento sarebbe come questo:

// Get current selected range , this example assumes is an insertion point or empty selection UITextRange *selectedRange = [textField selectedTextRange]; // Calculate the new position, - for left and + for right UITextPosition *newPosition = [textField positionFromPosition:selectedRange.start offset:-5]; // Construct a new range using the object that adopts the UITextInput, our textfield UITextRange *newRange = [textField textRangeFromPosition:newPosition toPosition:selectedRange.start]; // Set new range [textField setSelectedTextRange:newRange]; 

Per selezionare un intervallo di caratteri specifico, puoi fare qualcosa di simile in iOS 5+

 int start = 2; int end = 5; UITextPosition *startPosition = [self positionFromPosition:self.beginningOfDocument offset:start]; UITextPosition *endPosition = [self positionFromPosition:self.beginningOfDocument offset:end]; UITextRange *selection = [self textRangeFromPosition:startPosition toPosition:endPosition]; self.selectedTextRange = selection; 

Poiché UITextField e altri elementi UIKit hanno le proprie sottoclassi private di UITextPosition e UITextRange non è ansible creare direttamente nuovi valori, ma è ansible utilizzare il campo di testo per crearli per te da un riferimento all’inizio o alla fine del testo e un intero compensare.

Puoi anche fare il contrario per ottenere rappresentazioni integer dei punti iniziale e finale della selezione corrente:

 int start = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.start]; int end = [self offsetFromPosition:self.beginningOfDocument toPosition:self.selectedTextRange.end]; 

Ecco una categoria che aggiunge metodi per gestire le selezioni usando NSRange . https://gist.github.com/4463233

Per selezionare il nome di un file senza l’estensione del file, utilizzare questo:

 -(void) tableViewCellDidBeginEditing:(UITableViewTextFieldCell*) cell { NSInteger fileNameLengthWithoutExt = [self.filename length] - [[self.filename pathExtension] length]; UITextField* textField = cell.textField; UITextPosition* start = [textField beginningOfDocument]; UITextPosition* end = [textField positionFromPosition:start offset: fileNameLengthWithoutExt - 1]; // the -1 is for the dot separting file name and extension UITextRange* range = [textField textRangeFromPosition:start toPosition:end]; [textField setSelectedTextRange:range]; } 

Questi entrambi funzionano per me:

 [UITextField selectAll:self]; 

e:

 UITextField.selectedRange = NSMakeRange(0, 5); 

ma solo se il campo di testo è il primo a rispondere. (In altre parole, solo se la tastiera sta visualizzando.) Quindi, è necessario precedere uno dei metodi di selezione con questo:

 [UITextField becomeFirstResponder]; 

se vuoi che il testo appaia selezionato.

Solo una piccola aggiunta alla risposta accettata. In iOS 5, la seguente riga interrompe la mia app quando la lunghezza del testo di UITextView è 0 (non ha testo):

 [self textRangeFromPosition:startPosition toPosition:endPosition]; 

Una piccola soluzione è aggiungere una length == 0 controllare come:

 if (textField.text && textField.text.length > 0) { // Get current selected range , this example assumes is an insertion point or empty selection UITextRange *selectedRange = [textField selectedTextRange]; // Calculate the new position, - for left and + for right UITextPosition *newPosition = [textField positionFromPosition:selectedRange.start offset:-5]; // Construct a new range using the object that adopts the UITextInput, our textfield UITextRange *newRange = [textField textRangeFromPosition:newPosition toPosition:selectedRange.start]; // Set new range [textField setSelectedTextRange:newRange]; } 

veloce

Seleziona gli ultimi 5 caratteri:

 if let newPosition = textField.positionFromPosition(textField.endOfDocument, inDirection: UITextLayoutDirection.Left, offset: 5) { textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: textField.endOfDocument) } 

Seleziona un intervallo arbitrario:

 // Range: 3 to 7 let startPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 3) let endPosition = textField.positionFromPosition(textField.beginningOfDocument, inDirection: UITextLayoutDirection.Right, offset: 7) if startPosition != nil && endPosition != nil { textField.selectedTextRange = textField.textRangeFromPosition(startPosition!, toPosition: endPosition!) } 

La mia risposta completa è qui .