当我尝试在UISearchBar
上撤消时,我的应用崩溃了。在我的应用程序中,我有代码,以防止输入'%'在搜索栏上签名,为此,它将%替换为@""在textDidChange方法中如下:
- (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 :(得分:1)
您应该使用此委托方法:
- (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;
}