Как вы упомянули в своем вопросе, «диапазон» всегда равен 1, даже если целое слово удалено.
Вы должны проверить длину диапазона 'range.length', который предоставит вам точное количество символов, удаляемых из вашего UITextView.
У меня был такой же сценарий, и я немного поработал на его основе, что позволит удалить сразу только один символ, а не все слово:
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if([text isEqualToString:@""]) {
// Check if length of range being deleted is less than 1 then only delete it
if (range.length > 1) {
return NO;
} else
return YES;
} else {
return YES;
}
}