Is there any way to observe changes to the selectedTextRange of a UITextField?
I tried observing all UIControlEvents. But changing the selectedTextRange does not trigger a UIControlEvent.
Another dead end -- UIKit classes are not KVO compliant.
Then there is the UITextFieldTextDidChangeNotification. But that's for changes to the text.
Any ideas?
Subclass UITextField
as follows.
@interface WJTextField : UITextField
@end
@protocol WJTextFieldDelegate <UITextFieldDelegate>
- (void) textFieldDidChangeSelection: (UITextField *) textField;
@end
Implementation:
@implementation WJTextField
- (void) setSelectedTextRange: (UITextRange *) selectedTextRange
{
[super setSelectedTextRange: selectedTextRange];
if ([self.delegate respondsToSelector: @selector(textFieldDidChangeSelection:)])
[(id <WJTextFieldDelegate>) self.delegate textFieldDidChangeSelection: self];
}
@end
Then add -textFieldDidChangeSelection:
to your text field's delegate.
Caveat: This delegate message will be sent only when the cursor is moved, it will not be sent when typing or pasting text, for those events you have to implement textField:shouldChangeCharactersInRange:replacementString:
, where the selection range is going to either be set to range.location + [string length]
(if you return YES
) or remain the same (if you return NO
).