": Rango {0, 10} fuera de límites; error de longitud de cadena de 9 "con Deshacer

Mi aplicación falla cuando bash deshacer en UISearchBar . En mi aplicación tengo código para evitar ingresar un signo '%' en la barra de búsqueda y para hacerlo reemplaza un% a @ "" en el método textDidChange como se muestra a continuación:

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { self.searchBar.text = [searchText stringByReplacingOccurrencesOfString:@"%" withString:@""]; } 

Así que si escribo el text "abc% xyz", el text final visible en la barra de búsqueda sería 'abcxyz'. No cuando hago clic en deshacer, veo que 'xyz' se borra y todavía veo 'abc' en la barra de búsqueda en lugar de borrar 'abcxyz' todo de una vez.

Ahora, si hago clic en deshacer nuevamente para borrar 'abc', mi aplicación se bloquea con [NSBigMutableString substringWithRange:]: Range out of bounds error.

Estoy asumiendo que aunque '%' sea reemplazado por @ "", el administrador de deshacer aún podría estar reteniéndolo y, por lo tanto, el range está saliendo de límites.

Intenté [searchBar.undoManager removeAllActions]; en textDidChange después de replace% con @ "", pero no ayudó. Aquí está el código:

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { self.searchBar.text = [searchText stringByReplacingOccurrencesOfString:@"%" withString:@""]; [searchBar.undoManager removeAllActions]; } 

Pregunta: ¿Alguna vez se enfrentó a un problema similar? ¿Cómo manejo el deshacer?

En su lugar, debería utilizar este método de delegado:

  - (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

Y simplemente devuelva NO en caso de que el Texto de reemploop sea igual a "%". Esto evitará que el usuario lo use en primer lugar, ya que no actualizará el campo de text, lo que debería solucionar el problema de deshacer que está teniendo.

Solución

 - (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if([text isEqualToString:@"%"]) { return NO; } return YES; } 
    Intereting Posts