Это альтернативное решение с использованием недокументированного API: selectionRange
. Я не знаю, пройдет ли это проверку Apple, но, как написано, приложение не будет аварийно завершать работу, если метод недоступен и тоже не выдает предупреждений:)
Это категория на UITextField:
- (void)deleteBackward{
@try{
//check current selected range
NSRange selectedRange = [[self valueForKey:@"selectionRange"] rangeValue];
if (selectedRange.location == NSNotFound) selectedRange = NSMakeRange([[self text] length], 0);
if (selectedRange.location < 1) return;
//delete one char
NSRange deleteRange = (selectedRange.length>0)?selectedRange:NSMakeRange(selectedRange.location-1,1);
self.text = [self.text stringByReplacingCharactersInRange:deleteRange withString:@""];
//adjust the selected range to reflect the changes
selectedRange.location = deleteRange.location;
selectedRange.range.length = 0;
[self setValue:[NSValue valueWithRange:range] forKey:@"selectionRange"];
}@catch (NSException *exception) {
NSLog(@"failed but catched. %@", exception);
}@finally {}
}
ОБНОВЛЕНИЕ: 2011/11/17
в iOS5 UITextField и UITextView соответствуют протоколу UITextInput (который соответствует UIKeyInput ), так что вы можете сделать [textField deleteBackward];
, который будет действовать точно так же, как ключ Del
в клавиатура, [textField insertText:@"text"];
, которая будет вставлять текст и корректно обновлять позицию каретки, и т. д.
Итак, для целей совместимости, вероятно, то, что вы хотите сделать, похоже на это:
- (void) myDeleteBackward
{
if ([self conformsToProtocol:@protocol(UITextInput)]) {
// iOS5 and later
[textField deleteBackward];
// Or do below line if you are not deploy-targeting 5.0 or above and want to avoid warnings
//[textField performSelector:@selector(deleteBackward)];
} else {
// iOS4 and older versions
// Do the trick :)
@try{
...
}@catch (NSException *exception) {
...
}
}
}