“:范围{0,10}越界; string长度9“与撤消错误

当我尝试在UISearchBar撤消时,我的应用程序崩溃。 在我的应用程序,我有代码,以防止在search栏上input“%”符号,为此,它将textDidChange方法中的%replace为@“”,如下所示:

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

所以,如果我input文字“abc%xyz”,search栏上显示的最终文字就是“abcxyz”。 不,当我点击撤消,我看到'xyz'被清除,我仍然在search栏上看到'abc',而不是一次清除'abcxyz'。

现在,如果我再次点击撤消清除'abc'我的应用程序崩溃与[NSBigMutableString substringWithRange:]: Range out of bounds错误。

我假设即使'%'被replace为@“”,撤销pipe理器可能仍然持有它,因此范围超出了界限。

我试过[searchBar.undoManager removeAllActions]; 在用@“replace%后的textDidChange ,但是没有帮助。 这里是代码:

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

问题:以前有人遇到类似的问题吗? 我如何处理撤消?

你应该使用这个委托方法:

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

如果replacementText等于“%”,则返回NO。 这将阻止用户在第一时间使用它,因为它不会更新文本字段,这应该解决您所遇到的撤销问题。

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