Как добавить значок поиска в качестве раздела для SearchBar в UITableView с помощью контроллера поиска

Я пытаюсь добавить изображение для поиска (увеличительное стекло) в качестве раздела, чтобы легко перейти к строке поиска.

Вот проблема, с которой я сталкиваюсь: введите здесь описание изображения

Мой код для настройки разделов выглядит следующим образом:

Примечание: self.fbFriends — это массив словарей, в который входят друзья пользователя на Facebook.

self.fbFriends = [[NSArray alloc] initWithArray:[[MESCache sharedCache] facebookFriends]];
self.searchResults = [[NSMutableArray alloc] init];
self.sections = [[NSMutableDictionary alloc] init];

BOOL found;

[self.sections setValue:[[NSMutableArray alloc] init] forKey:UITableViewIndexSearch];

// Loop through the friends and create our keys
for (NSDictionary *friend in self.fbFriends)
{
    NSString *c = [[friend objectForKey:@"name"] substringToIndex:1];

    found = NO;

    for (NSString *str in [self.sections allKeys])
    {
        if ([str isEqualToString:c])
        {
            found = YES;
        }
    }

    if (!found)
    {
        [self.sections setValue:[[NSMutableArray alloc] init] forKey:c];
    }
}

// Loop again and sort the friends into their respective keys
for (NSDictionary *friend in self.fbFriends)
{
    [[self.sections objectForKey:[[friend objectForKey:@"name"] substringToIndex:1]] addObject:friend];
}

// Sort each section array
for (NSString *key in [self.sections allKeys])
{
    [[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];
}

Вот мои настройки раздела и представления заголовков:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return 1;
    } else {
        return [[self.sections allKeys] count];
    }
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return NSLocalizedString(@"FbFriendsSearchControllerSection", @"Fb Friends search controller - section title for search results table view");
    } else {
        return [[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:section];
    }
}

Кто-нибудь видит, как это неправильно?


person StuartM    schedule 20.05.2013    source источник


Ответы (1)


Это не стандартная практика. Нет необходимости в дополнительном разделе только для отображения поиска.

Не добавляйте раздел «поиск» в свой self.sections словарь. Вместо этого у вас есть только разделы для фактических данных. Затем в вашем методе tableView:sectionForSectionIndexTitle:atIndex: вы можете сделать:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    NSInteger res = 0;
    if (tableView == self.tableView) {
        if (index == 0) {
            // If the user taps the search icon, scroll the table view to the top
            res = -1;
            [self.tableView setContentOffset:CGPointMake(0, 0) animated:NO];
        } else {
            res = ... // return the proper index for your data
        }
    } else {
        res = 0;
    }

    return res;
}

Примечание: вам действительно нужно иметь множество словарей. Основной массив должен представлять разделы. Как и сейчас, вы постоянно получаете ключи основного словаря и сортируете их. Это будет сделано МНОГО раз - все без надобности. Использование массива позволяет быстро получить данные из индекса раздела.

person rmaddy    schedule 20.05.2013
comment
Информация о друзьях в facebook хранится в массиве, каждый друг представляет собой словарь в массиве. Затем словарь для друга включает идентификатор и имя друга. Затем я перебираю массив словарей (self.fbFriends), собирая первую букву каждого имени, чтобы создать массив для разделов. Как еще вы бы порекомендовали попытаться выполнить это? - person StuartM; 21.05.2013
comment
self.sections представляет собой массив строковых символов из первого символа из каждого имени словаря (т.е. имени друга), он создается только в viewDidLoad и не изменяется позже, поэтому его следует создавать только один раз? - person StuartM; 21.05.2013
comment
Нет, self.sections это NSDictionary, а не NSArray. Как еще вы могли звонить allKeys по этому поводу? Вы хотите, чтобы массив был создан один раз, поэтому вам не нужно вызывать allKeys и сортировать полученный массив снова и снова, как в опубликованном коде. - person rmaddy; 23.05.2013
comment
Можете ли вы объяснить, как это вызывается снова и снова, когда оно запускается только один раз, когда загружается только представление? Не могли бы вы привести пример кода, как сделать то же самое с массивом, пожалуйста? - person StuartM; 25.05.2013
comment
Он предлагает вытащить [self.sections allKeys] в окно загрузки. - person Conor; 24.08.2013