如何在IOS中从多个数组中搜索UITableView中的单元格

时间:2014-02-04 13:08:19

标签: ios iphone objective-c uitableview

实际上我从 JSON webservice获取数据。我需要使用UITableViewuisearchdisplaycontroller单元格中搜索数据。

我已使用具有多个数组的NSMutablArray成功将数据传递到单元格中。但现在我需要从中搜索数据。

我的阵列:

[
 { 
   "name": "jhon", 
   "city": "chennai",
 }
 { 
   "name": "Micle", 
   "city": "Newyork",
 }
 { 
   "name": "Micle", 
   "city": "Washigton",
 }
]

我在UITableView中的自定义单元格:

cell.P_name.text = [details objectForKey:@"name"];
cell.P_city.text = [details objectForKey:@"city"];

在搜索中我试过:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
   //-- Help to customize operations
    searchResults = [[NSArray alloc]initWithArray:mainArray];
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText];
    searchResults = [details filteredArrayUsingPredicate:resultPredicate];
   [tableView reloadData];
}

任何人都可以帮忙解决我的问题。

2 个答案:

答案 0 :(得分:3)

你应该有2个数组:

  1. 您的JSON主数据存储(mainDataList
  2. 您的数据源数组用于填充表格视图(dataSourceList
  3. 最初:

    self.dataSourceList = self.mainDataList;
    

    因为您正在显示表视图中的所有数据。取消任何搜索后,您也会返回此状态(然后重新加载)。

    但是在搜索时,您需要过滤dataSourceList的内容并重新加载表格:

    - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
    {
        NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
    
        self.dataSourceList = [self.mainDataList filteredArrayUsingPredicate:resultPredicate];
    
        [tableView reloadData];
    }
    

    注意:上述谓词只搜索词典中的name ...

    现在,您的所有表视图方法仅使用self.dataSourceList,并根据您的状态修改其内容。你的代码干净简单。微笑: - )

答案 1 :(得分:0)

我只是把我的逻辑在 .h 文件名中添加了一个可变数组 _temArray

_mainArray (填充在tableView上)添加到您的 _temArray ,例如,

[_temArray addObjectsFromArray:_mainArray];

在搜索方法中,使用NSPredicate

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
   //-- Help to customize operations

    if([searchText length] > 0)
    {
        NSMutableArray *fileterMainArray = (NSMutableArray *)_temArray
        NSPredicate *predicatePeople = [NSPredicate predicateWithFormat:@"name BEGINSWITH[cd] %@", searchText]; // here if you want to search by city then change "name" to "city" at pattern.
        NSArray *filteredArray = [fileterMainArray filteredArrayUsingPredicate:predicatePeople];
        [_mainArray addObjectsFromArray:filteredArray];
    }
    else
        [_mainArray addObjectsFromArray:_temArray];

   [self.tblView reloadData]; // don't forget to reload Table data.
}