UISearchBar и NSDictionary - PullRequest
       22

UISearchBar и NSDictionary

0 голосов
/ 15 августа 2011

Я хочу добавить в мое приложение UISearchBar.

У меня есть 3 NSDictionary, который содержит соответственно 3 массива (отсортировано). 3 NSDictionaries имеют одинаковый ключ (@"Elements"), хранящийся в NSMutableArray с именем listObjects.

В конце 3-х диктов у меня такая ситуация:

[listObjects addObject:dictOne];
[listObjects addObject:dictTwo];
[listObjects addObject:dictThree];  

У меня также есть FilterListContent для хранения массивов (для быстрого поиска).

filteredListContent = [[NSMutableArray alloc] initWithCapacity: [listObjects count]];
[filteredListContent addObjectsFromArray: listObjects];

Теперь первый вопрос: хранит ли в фильтре FilterListContent все 3 ключа dict из listObjects?

Тогда.

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

    [self.filteredListContents removeAllObjects]; 
    NSString *cellTitle;
    for (cellTitle in listObjects){
        NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];
        if (result == NSOrderedSame){
            [filteredListContents addObject:cellTitle];
        }
    }
}

Я получил сбой, когда начал печатать

NSComparisonResult result = [cellTitle compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];` 

линия. Должен ли быть ключ dict (@"Elements") для поиска во всех 3 массивах или?

Редактировать

Полный код

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSDictionary *dictionary = [listObjects objectAtIndex:section];
    NSArray *array = [dictionary objectForKey:@"Elements"];
    return [array count];
}


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

        NSString *cellTitle;
        for (NSDictionary *dict in listaObjects)
        {
            NSArray *elements = [dict objectForKey: @"Elements"];
            for (NSString *cellTitle in elements)
                if ([cellTitle compare: searchText options: NSCaseInsensitiveSearch range: NSMakeRange(0, [searchText length])] = NSOrderedSame)])
                    [filteredListContent addObject: cellTitle];

        }}

    #pragma mark -
    #pragma mark UISearchDisplayController Delegate Methods

    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
        [self filterContentForSearchText:searchString scope:
         [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

        // Return YES to cause the search result table view to be reloaded.
        return YES;
    }


    - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{

        [self filterContentForSearchText:[self.searchDisplayController.searchBar text] scope:
         [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

        // Return YES to cause the search result table view to be reloaded.
        return YES;
    }

У меня все работает, но оно показывает содержимое всех массивов, даже если я набираю определенное слово. Что я делаю не так?

1 Ответ

2 голосов
/ 15 августа 2011

Я не понимаю.Сначала вы добавляете три словаря в FilterListContents, а затем удаляете все объекты из массива?Это означает, что массив снова полностью пуст.

Затем вы перечислите listObjects, который содержит только 3 словаря и не содержит строк, используя перечислитель NSString.Это не имеет смысла.

Во-первых, в этом нет необходимости:

[filteredListContents addObjectsFromArray: listObjects];

Так что удалите эту строку .Теперь сделайте что-то вроде:

for (NSDictionary *dict in listObjects)
{
    NSArray *elements = [dict objectForKey: @"Elements"];
    for (NSString *cellTitle in elements)
        if (cellTitle compare: searchText options: options: NSCaseInsensitiveSearch range: NSMakeRange(0, [searchText length])] = NSOrderedSame)
            [filteredListContents addObject: cellTitle];

}

ОК, что даст вам массив одинаковых строк.Что теперь?Я ожидаю, что вы соберете клетки с этим названием, но вы не делаете этого здесь.Вместо хранения строк вы можете хранить словари с заголовком ячейки в качестве ключа и ячейкой в ​​качестве значения.Это сделало бы петлю только на один уровень глубже.

Как сказал кто-то мудрее меня: Покажи мне свою проблему, а не свое решение.Тогда я могу вам помочь.

Полный код не имеет для меня никакого смысла, извините.Что вы на самом деле пытаетесь собрать?

...