2014-04-03 13 views
7

Moja aplikacja ulega awarii, gdy próbuję wykonać cofanie na UISearchBar. W mojej aplikacji mam kodu, aby zapobiec wprowadzeniu „%” znak na pasku wyszukiwania i robi to zastępuje on% do @ „” w metodzie textDidChange jak poniżej:"[NSBigMutableString substringWithRange:]: Zakres {0, 10} poza zakresem, długość łańcucha 9" z Undo

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

Więc jeśli mam wpisać tekst „abc % xyz ", ostateczny tekst widoczny na pasku wyszukiwania byłby" abcxyz ". Nie, gdy klikam Cofnij, widzę, że "xyz" zostaje wyczyszczony i nadal widzę "abc" na pasku wyszukiwania zamiast czyścić "abcxyz" za jednym razem.

Teraz, jeśli kliknę ponownie cofnij, aby wyczyścić "abc", moja aplikacja ulega awarii z błędem [NSBigMutableString substringWithRange:]: Range out of bounds.

Zakładam, że nawet jeśli "%" zostanie zastąpiony przez @ "", menedżer cofania może nadal go trzymać, a tym samym zakres wykracza poza granice.

Próbowałem [searchBar.undoManager removeAllActions]; w textDidChange po zastąpieniu% z @ "", ale to nie pomogło. Oto kod:

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

Pytanie: Ktoś w obliczu podobnego problemu wcześniej? Jak radzić sobie z cofaniem?

+0

Choć removaAllActions pracował dla mnie. Ostatecznie zdecydowaliśmy się wyłączyć shake, by cofnąć naszą aplikację. – SuperGuyAbe

Odpowiedz

1

Należy używać tej metody delegata zamiast:

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

I po prostu nie zwraca w przypadku replacementText jest równa „%”. Zapobiegnie to użyciu przez użytkownika, ponieważ nie zaktualizuje pola tekstowego, co powinno rozwiązać problem z cofaniem.

Rozwiązanie

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

    return YES; 
} 
Powiązane problemy