如何在xib中的tableview中实现SearchBar和搜索显示控制器

时间:2013-08-09 11:01:11

标签: iphone ios uitableview uisearchbar uisearchdisplaycontroller

我有dictionaries的可变数组。我在表视图中显示该数组。

现在我想实现搜索和显示控制器到表视图。怎么样?

任何建议或代码..

这里我的数组我在uitableview中按字母顺序显示“name”键。

[
        {
            "name": "Fish",
            "description": "sdhshs",
            "colorCode": null,
        },
        {
            "name": "fry",
            "description": "sdhshs",
            "colorCode": null,
        },
        {
            "name": "curry",
            "description": "sdhshs",
            "colorCode": null,
        }
    ],

2 个答案:

答案 0 :(得分:2)

以下是示例代码

NSMutableArray *filteredResult; // this holds filtered data source
NSMutableArray *tableData; //this holds actual data source

-(void) filterForSearchText:(NSString *) text scope:(NSString *) scope
{
    [filteredResult removeAllObjects]; // clearing filter array
    NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"SELF.restaurantName contains[c] %@",text]; // Creating filter condition
    filteredResult = [NSMutableArray arrayWithArray:[tableData filteredArrayUsingPredicate:filterPredicate]]; // filtering result
}

委派方法

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

    return YES;
}

-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption
{
    [self filterForSearchText:self.searchDisplayController.searchBar.text scope:
 [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];

    return YES;
}

在NSPredicate条件中,“@”SELF.restaurantName包含[c]%@“,text”restaurantName是需要过滤的属性名称。如果您的数据源数组中只有NSString,则可以使用类似@“SELF contains [c]%@”,text

完成过滤后,您需要相应地实现tableview委托。像这样的东西

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(tableView == [[self searchDisplayController] searchResultsTableView])
    {
        return [filteredResult count];
    }
    else
    {
        return [tableData count];

    }

}

比较tableview是否是过滤的tableview或原始tableview并相应地设置tableview的委托和数据源。请注意,searchDisplayController是UIViewcontroller的可用属性,我们可以用它来显示过滤结果。

要使上述代码生效,如果您在XIB或故事板中使用它,则需要使用“搜索栏和搜索显示”对象

答案 1 :(得分:1)