UISearchBar Поиск строки таблицы с текстом, подтекстом и изображением - PullRequest
2 голосов
/ 10 июня 2011

Я заметил, что для поиска в таблице, копия этих данных должна быть вставлена ​​в поисковый массив.

Например,

    //Initialize the array.
listOfItems = [[NSMutableArray alloc] init];

NSArray *countriesToLiveInArray = [NSArray arrayWithObjects:@"Iceland", @"Greenland", @"Switzerland", @"Norway", @"New Zealand", @"Greece", @"Rome", @"Ireland", nil];
NSDictionary *countriesToLiveInDict = [NSDictionary dictionaryWithObject:countriesToLiveInArray forKey:@"Countries"];

NSArray *countriesLivedInArray = [NSArray arrayWithObjects:@"India", @"U.S.A", nil];
NSDictionary *countriesLivedInDict = [NSDictionary dictionaryWithObject:countriesLivedInArray forKey:@"Countries"];

[listOfItems addObject:countriesToLiveInDict];
[listOfItems addObject:countriesLivedInDict];

//Initialize the copy array.
copyListOfItems = [[NSMutableArray alloc] init];

Итак, что искали, так это объекты, которые хранятся в скопированном массиве.

Мой вопрос: как мне найти строки ячеек с текстом, подтекстом и изображением в этой конкретной ячейке.

Ответы [ 2 ]

3 голосов
/ 19 ноября 2011

(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 (пользователь набрал букву в строке поиска).

2 голосов
/ 23 ноября 2011

Есть несколько шагов. Обратите внимание, что приведенный ниже код является лишь примером, который я сейчас набираю вручную, поэтому он, вероятно, не будет компилироваться, это просто для того, чтобы дать вам представление.

1) Убедитесь, что у вас есть массив, содержащий все значения ячеек.

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

3) Установите себя в качестве делегата для UISearchBar и отвечайте на его события:

- (void)searchBarButtonClicked(UISearchBar *)searchBar {
    [self doSearch:searchBar.text];
}

- (void)searchBar(UISearchBar *)searchBar textDidChange:(NSString *)searchTerm {
    if (searchTerm.length == 0) {
        [self resetSearch];
        [table reloadData];
    }
    else
        [self doSearch:searchTerm];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    searchBar.text = @"";
    [self resetSearch];
    [table reloadData];
    [searchBar resignFirstResponder];
 }

4) Создайте другие методы

Метод resetSearch просто должен скопировать ваш полный массив данных в массив источника данных, используемый вашими делегатами таблицы:

- (void)resetSearch {
    self.tableSourceArray = [self.dataSourceArray copy]; // Or write a deep copy if you want to.
}

Тогда как при поиске нам нужно отфильтровать массив datasource. Возможно, вам удастся создать что-то более эффективное - это всего лишь пример.

- (void)doSearch:(NSString *)searchTerm {

    NSMutableArray *filtered = [[NSMutableArray alloc] init];
    for (NSString *item in self.self.dataSourceArray) {
        if ([item rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound])
            [filtered addObject:[item copy]];
    }

   self.tableSourceArray = filtered;
}

И это должно быть!

Тим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...