(1)
Нет такой вещи, как поиск в таблице.То, что происходит, когда пользователь вводит текст в UISearchBar, полностью зависит от вас - вы можете заставить эту операцию означать что угодно.Все, что вам нужно сделать, это функционировать в качестве источника делегатов и данных для таблицы результатов и сформировать таблицу результатов в ответ на стандартные три больших вопроса, которые составляют основу для любой таблицы («сколько у вас разделов? Сколько»строки в этом разделе? какая ячейка для этой строки? ") в любой , как вам нравится.Таблица результатов часто выглядит как уменьшенная версия исходной таблицы, но это совсем не обязательно!Это может быть любая таблица, которой вы хотите.
(2)
Не путайте Модель с Видом.Стол - только представление.Ваши данные - модель.Именно Модель, ваши данные, которая является основой исходной таблицы, вы будете искать.Поэтому, когда пользователь вводит ваш UISearchBar и вы начинаете поиск, вы хотите сформировать новую модель, которая станет основой таблицы результатов.Как вы формируете это полностью зависит от вас.Обычно вам нужно фильтровать исходную модель, чтобы в вашей модели результатов оставалось только то, что считается действительным результатом.Вы можете сделать это, пройдясь по всей оригинальной модели, поместив все, что соответствует критерию поиска, в новую модель.Или, если исходная модель является массивом, вы можете использовать один из фильтров FilterArray, чтобы помочь вам.Самый гибкий способ - сформировать предикат с блоком, как в этом примере из моей книги:
NSPredicate* p = [NSPredicate predicateWithBlock:
^BOOL(id obj, NSDictionary *d) {
NSString* s = obj;
NSStringCompareOptions options = NSCaseInsensitiveSearch;
return ([s rangeOfString:sbc.searchBar.text
options:options].location != NSNotFound);
}];
self.filteredStates = [states filteredArrayUsingPredicate:p];
В этом примере s
(один элемент массива) - это строка каждый раз,и я смотрю, есть ли в этой строке поисковый запрос пользователя.Но если у вас есть словарь или другая структура, содержащая как заголовок, так и субтитры и информацию об изображении, вы можете исследовать этот словарь любым удобным вам способом.Это просто вопрос возврата ДА или НЕТ в зависимости от того, проходит ли этот элемент массива тест на основе критерия поиска, независимо от того, какое определение вы приложите к понятию прохождения теста.
(3)
Остается большой вопрос при для формирования модели результатов.Я обычно начинаю с того, что делаю модель результатов идентичной исходной модели в ответ на searchDisplayControllerWillBeginSearch
, потому что в противном случае в таблице результатов будет указано «Нет результатов», пока пользователь печатает.(Вероятно, поэтому вы думаете, что первое, что нужно сделать, это скопировать оригинальную модель.) Затем я могу либо выполнить фактическую фильтрацию в ответ на searchBarSearchButtonClicked
(пользователь закончил печатать и нажал Поиск), либо, если модельдостаточно маленький, я могу отфильтровать его заново после каждой буквы, которую пользователь вводит, в ответ на searchBar:textDidChange
(пользователь набрал букву в строке поиска).