2014-04-03 295 views
7

当我尝试在UISearchBar上尝试撤消时,我的应用崩溃。在我的应用我有代码,以防止输入搜索栏上的“%”标志,这样做它取代了为@“”在textDidChange方法如下:“[NSBigMutableString substringWithRange:]:范围{0,10}越界;字符串长度9”与撤消错误

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

所以,如果我输入文字“ABC %xyz“,在搜索栏上可见的最终文本将是'abcxyz'。不,当我点击撤消,我看到'xyz'被清除,我仍然在搜索栏上看到'abc',而不是一次清除'abcxyz'。

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

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

我试过[searchBar.undoManager removeAllActions];textDidChange之后我用@“”替换%,但没有帮助。下面是代码:

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

问:任何人之前遇到过类似的问题?我如何处理撤消?

+0

虽然removaAllActions为我工作。我们最终选择关闭摇动来取消我们的应用程序。 – SuperGuyAbe

回答

1

您应该使用此委托方法代替:

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

,就回到NO的情况下,replacementText等于“%”。这将阻止用户首先使用它,因为它不会更新文本字段,它应该解决您遇到的撤销问题。

解决方案

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

    return YES; 
}