Iphone搜索栏清除按钮崩溃的应用程序

时间:2009-09-01 22:32:40

标签: iphone cocoa-touch uitableview uisearchbar

我正在使用带有搜索功能的iPhone应用程序,在UISearchBar中编写搜索词会更改(过滤)下面UITabelView的输出。

当用户正在编辑搜索栏的内容并删除所有文本时,以下代码将在

中执行
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {

  if([searchText isEqualToString:@""] || searchText==nil){

    [tableData removeAllObjects]; //clear array that holds data for table view
    [tableData addObjectsFromArray:tumorNames]; //load array with database
    [searchTableView reloadData];
    return;
    }
}

(method continues...)

现在,在搜索栏内进行编辑时,此功能正常:是否使用退格/删除删除所有文本或按“清除”按钮无关紧要 - 搜索字段已清除且所有可搜索项目均可见在表格视图中。按下“取消”按钮也是如此,但在这种情况下,搜索栏当然会取消第一响应者。

但是,当进行搜索并且在表格视图中显示一个或多个结果项目时(搜索栏已经退出第一响应者并且键盘不见了),仍然可以按下清除按钮,但会导致应用程序崩溃以下消息:

'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'

看来问题出在表视图数据的重新加载中,但我无法弄清楚为什么在一种情况下会出现数组索引的问题,而在另一种情况下却没有问题。

任何人都知道为什么会这样?所有帮助表示赞赏。

格里, 瑞典

3 个答案:

答案 0 :(得分:2)

当点击清除按钮时,结果是委托方法

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
在方法

之后

被称为

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

这可能看起来很奇怪,但解释了我的问题:当我在前一个方法中刷新保存表视图数据的数组时(清除上一次搜索),当表视图尝试从中读取时出现错误。

问题解决了,希望这些信息对其他人有帮助。

现在我需要做的就是在点击取消按钮时使搜索栏不成为第一响应者。有谁知道怎么做?

格里, 瑞典

答案 1 :(得分:1)

(void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText {
        ... 
        [searchBar becomeFirstResponder]; 
 [self.tableView reloadData];

答案 2 :(得分:0)

如果搜索字段包含- (BOOL)acceptsFirstResponder,但是数组NO,您可以尝试覆盖@""并返回!= nil。我认为这应该有效。