Поиск по основной информации с поддержкой UITable проблема? - PullRequest
0 голосов
/ 22 октября 2009

Не уверен, что это правильное место (я уверен, что кто-то сообщит мне, если это не так) У меня есть приложение для iPhone, которое имеет UITableview, которое поддерживается основными данными. Я хочу выполнить сокращенный поиск, чтобы отображались только элементы, начинающиеся с символов, введенных в строку поиска. Обычно это делается с делегатом - (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText без проблем. Я немного запутался, поскольку я новичок в Core Data, как это сделать. Одна из больших проблем, как я вижу, это обновление интерфейса, чтобы он знал, что представить. Я предполагаю, что альтернативный NSFetchedResultsController должен быть отправлен в UITableView, это правильно?

Итак, вот мои проблемы: 1) Я предполагаю, что мне нужно создать NSFetchedResultsController только с правильными элементами в нем, а затем сказать UITableView, чтобы использовать его в качестве источника данных и перезагрузить таблицу? 2) есть ли лучший способ, чем выполнить полностью отсортированную выборку и удалить те объекты, которые не соответствуют. т.е. есть ли способ сделать выбор, где тип выборки?

Заранее спасибо и извините, если это глупый вопрос.

С уважением Дэмиен

Ответы [ 2 ]

2 голосов
/ 30 октября 2009
  1. Да, вам понадобится новый NSFetchedResultsController.
  2. Вы должны использовать NSPredicate в вашем новом NSFetchRequest для фильтрации по тексту поиска.

Например, если ваши управляемые объекты имеют поле «имя», которое необходимо отфильтровать:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K beginswith[c] %@", @"name", searchText];
[fetchRequest setPredicate:pred];
0 голосов
/ 24 мая 2011

Я использовал немного другое решение: вместо того, чтобы полагаться на другой NSFetchedResultsController, я создал NSMutableArray (FilterListContent) в контроллере табличного представления, который использовался для хранения временных данных, как вдохновлено примером кода Apple и учебник Мугунта Кумара .

В tableView: cellForRowAtIndexPath:, возвращая соответствующий массив источника данных:

if(receivedTableView == self.searchDisplayController.searchResultsTableView){
        Objects* object = [self.filteredListContent objectAtIndex:indexPath.row];
        cell.textLabel.text = object.name;
    } else {
        Objects* object = [self.unfilteredListContent objectAtIndex:indexPath.row];
        cell.textLabel.text = object.name;
    }

Как и в примере кода Apple, добавьте почти такой же метод в другие методы, такие как

- (NSInteger)tableView:(UITableView *)receivedTableView numberOfRowsInSection:(NSInteger)section {

    if(receivedTableView == self.searchDisplayController.searchResultsTableView){
       return [self.filteredListContent count];
    }

    return [self.unfilteredListContent count];
}

Как и в tableView: didSelectRowAtIndexPath: ... Затем соответствовал протоколу UISearchDisplayDelegate и добавил следующие методы:

- (void)filterContentForSearchText:(NSString*)searchText
{

    if (!self.filteredListContent) {
        self.filteredListContent = self.filteredListContent = [[NSMutableArray alloc] init];
    }

    [self.filteredListContent removeAllObjects];


    for (Objects *object in [self.coreDataStuffVariable.fetchedResultsController fetchedObjects])
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:
                                  @"(SELF contains[cd] %@)", searchText];

        NSString * elementTitle = [NSString stringWithFormat:@"%@", object.name];

        [elementTitle compare:searchText options:NSCaseInsensitiveSearch];

        if([predicate evaluateWithObject:elementTitle])
        {
            [self.filteredListContent addObject:password];
        }
    }
}



- (BOOL)searchDisplayController:(UISearchDisplayController *)controller 
shouldReloadTableForSearchString:(NSString *)searchString{
    [self filterContentForSearchText:searchString];
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

Довольно просто. Я думаю, это может плохо закончиться, если основные объекты данных будут перезагружены во время поиска, но хорошо ... если вы можете спать, зная, что тогда это может быть хорошим решением!

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