搜索UITableView时隐藏索引栏

时间:2012-07-15 18:03:59

标签: ios xcode indexing uisearchbar

我为表格视图实现了搜索栏和索引功能。运作良好。但是,我注意到当我在搜索栏中单击时,索引仍然可用并单击它会导致不可预测的结果。而不是调试,我认为隐藏索引会更简单:)

我在别处找到了调用sectionIndexTitlesForSectionView并返回nil的引用。因此,当我在搜索框中点击searchBarTextDidBeginEditing时,我已对[self sectionIndexTitlesForSectionView:[self tableView]]进行了明确调用。

结果是sectionIndexTitlesForSectionView确实被调用并返回nil,但索引仍然存在。

任何想法/建议将不胜感激! 贝。

3 个答案:

答案 0 :(得分:25)

如果您的搜索处于有效状态,则必须在- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView中返回nil,正如您在帖子中所述。然后,覆盖UISearchDisplayDelegate中的两个方法来刷新索引。

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    [self.tableView reloadSectionIndexTitles];
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    [self.tableView reloadSectionIndexTitles];
}

对于sectionIndexTitlesForTableView方法,我更喜欢使用:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    if (self.searchDisplayController.active) {
        return nil;
    } else {
        //Add @"{search}", to beginning to add search icon to top of index
        return @[@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", @"#"];
    }
}

注意:我发现您必须在if条件中使用self.searchDisplayController.active。如果您使用tableView != self.tableView,则无效。

答案 1 :(得分:0)

在显示搜索结果时,只需让方法(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView返回nil即可。

就我而言,这看起来像这样:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    if (tableView == [self tableView]) {
        return [[NSArray arrayWithObject:UITableViewIndexSearch] arrayByAddingObjectsFromArray:[collation sectionIndexTitles]];
    }
    // search view, no index:
    else return nil;
}

答案 2 :(得分:0)

这是一种简单的方法,如果你不想在sectionIndexTitlesForTableView中传递nil,如果你只需要为搜索文本制作一个索引,并希望将搜索文本显示为节标题。

NSArray *subViewsOfTblView = [self.tableView subviews];
if([subViewsOfTblView count] > 0)
{
    UIView *indexVw = (UIView*)subViewsOfTblView[[subViewsOfTblView count] - 1];
    if(isSearchON || isFilterON)
        indexVw.hidden = YES;
    else
        indexVw.hidden = NO;
}