2009-09-01 3 views
1

Я работаю над iPhone-приложением с функцией поиска, где запись условий поиска в UISearchBar изменяет (фильтрует) вывод UITabelView ниже.Iphone Search Bar clear button crashing app

Когда пользователь редактирует содержимое панели поиска и удаляет весь текст, следующий код выполняется в

- (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)' 

представляется, что проблема заключается в повторной загрузки данных просмотра таблицы, но я не могу понять, почему не было бы проблем с индексом массива в одном случае, но не в другом.

Кто-нибудь знает, почему это произойдет? Вся помощь была оценена.

Грегор, Швеция

ответ

2

Оказывается, когда кнопка ясно нажата, метод делегата

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 

вызывается после метод

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

Это может показаться странным, , но объясняет мою проблему: поскольку я очищаю массив, содержащий данные для табличного представления в прежнем мне thod (чтобы очистить последний поиск), я получаю сообщение об ошибке, когда представление таблицы пытается его прочитать.

Проблема решена, надеюсь, что эта информация полезна кому-то другому.

Все, что мне нужно сделать, это заставить панель поиска не становиться первой ответной стороной, когда нажата кнопка отмены. Кто-нибудь знает, как это сделать?

Грегор, Швеция

+0

[поискBar resignFirstResponder]; делает трюк – Souljacker

0

Вы можете попробовать перекрывая - (BOOL)acceptsFirstResponder и возвращение NO если searchfield содержит @"", но массив != nil. Я думаю, что это должно сработать.

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