Obtener la position del cursor de UITextField en ios

Estoy tratando de controlar la position del cursor en UITextField. Los usuarios no pueden insert más de un carácter a la vez en el medio del campo de text. Lo mueve al final del campo de text. Entonces esta publicación en SO: controle la position del cursor en UITextField Resuelve mi problema. Pero necesito saber la position actual del cursor.

Mi código se ve así:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField.tag == 201) { [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)]; } } 

Me está dando un error en idx. ¿Cómo encuentro eso?

UITextField ajusta al protocolo UITextInput que tiene methods para get la selección actual. Pero los methods son complicados. Necesitas algo como esto:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField.tag == 201) { UITextRange *selRange = textField.selectedTextRange; UITextPosition *selStartPos = selRange.start; NSInteger idx = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selStartPos]; [myclass selectTextForInput:textField atRange:NSMakeRange(idx, 0)]; } } 

Versión Swift

 if let selectedRange = textField.selectedTextRange { let cursorPosition = textField.offsetFromPosition(textField.beginningOfDocument, toPosition: selectedRange.start) print("\(cursorPosition)") } 

Mi respuesta completa sobre cómo get y configurar la position del cursor está aquí .

El código que ha publicado no funcionará para determinar dónde está el cursor. Necesitas el método get, no el set. Debería ser algo similar a lo siguiente:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField.tag == 201) { UITextRange selectedRange = [textField selectedTextRange]; // here you will have to check whether the user has actually selected something if (selectedRange.empty) { // Cursor is at selectedRange.start ... } else { // You have not specified home to handle the situation where the user has selected some text, but you can use the selected range and the textField selectionAffinity to assume cursor is on the left edge of the selected range or the other ... } } } 

Para get más información, consulte el protocolo UITextInput http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextInput_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UITextInput

Actualización: @rmaddy ha publicado algunos buenos bits adicionales que extrañé en mi respuesta: cómo manejar la position del text desde el NSTextRange y convertir NSTextPosition a int.