" [NSBigMutableString substringWithRange:]:范围{0,10}越界;字符串长度9"撤消错误

时间:2014-04-03 17:51:31

标签: ios objective-c uisearchbar undo nsundomanager

当我尝试在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];
    }

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

1 个答案:

答案 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;
}