如何在 UITableview 中使用 UISearchBar 在本地 JSON 中获取数据?

Posted

技术标签:

【中文标题】如何在 UITableview 中使用 UISearchBar 在本地 JSON 中获取数据?【英文标题】:How to Fetch data in Local JSON with UISearchBar in a UITableview? 【发布时间】:2015-06-19 05:21:31 【问题描述】:

我正在开发一个具有 .JSON 格式的本地狗数据库的应用程序

我能够获取 Tableview 中的所有数据,它的工作原理如下:

-(void)readDataFromFile

    NSString * filePath =[[NSBundle mainBundle] pathForResource:@"Dogs" ofType:@"json"];

    NSError * error;
    NSString* fileContents =[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];


    if(error)
    
        NSLog(@"Error reading file: %@",error.localizedDescription);
    


    rows = (NSArray *)[NSJSONSerialization
                                JSONObjectWithData:[fileContents dataUsingEncoding:NSUTF8StringEncoding]
                                options:0 error:NULL];

现在我的目标是通过搜索栏实现一个搜索系统,让我可以直接在 JSON 文件中找到一个数组。这是 JSON 的配置:

[
    
        "id": "6523",
        "ident": "00A",
        "type": "Pitbull",
        "name": "Rocky",

    ,
    
        "id": "6524",
        "ident": "00AK",
        "type": "Pitbull",
        "name": "Sam",

    ,


 

我想什么时候在搜索栏中写 Rocky...它显示了数组中的所有信息。

我添加了这个搜索方法:

#pragma Search Methods

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

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", searchText];
    self.searchResults = [[self.array valueForKey:@"name"] filteredArrayUsingPredicate:predicate];





-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString

    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;

这是我的 TableView 方法

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    if (tableView == self.searchDisplayController.searchResultsTableView) 
        return [self.searchResults count];

     else 
        return 150;
    




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    DogCell *cell = (DogCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];

    static NSString *CellIdentifier = @"cell";

    if(cell == nil)
    
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                      reuseIdentifier:CellIdentifier];
    

    if (tableView == self.searchDisplayController.searchResultsTableView) 


        cell.textLabel.text = [self.searchResults objectAtIndex:indexPath.row];

//我也想知道 Dog "ident" 的详细信息; //cell.detailTextLabel.text = [self.searchResults objectAtIndex:indexPath.row];

     else 

 cell.textLabel.text = [[self.array objectAtIndex:indexPath.row]valueForKey:@"name"];
        cell.detailTextLabel.text = [[self.array objectAtIndex:indexPath.row]valueForKey:@"ident"];


    




    return cell;

现在我可以通过 SearchBar 进行搜索,但我不能同时拥有 JSON 数组的两个值。我的意思是:

1) 当我在搜索栏中搜索 Rocky 时,我得到一个仅包含的单元格:

洛基,但不是身份

我的新目标

有一种方法可以在搜索后在单元格中同时获取“身份和名称”?

【问题讨论】:

【参考方案1】:
@property (strong, nonatomic) NSMutableArray nameArray;

@property (strong, nonatomic) NSMutableArray responseArray;

首先将名称值存储在单独的数组中。(如果名称是唯一的)

for(int i=0 ; i

  [nameArray addObject:[[responseArray objectAtIndex:i]objectForKey:@"name"]];

//名称数组:( 洛基, 山姆, 阿伦 ) //SearchBarText - @"Sam"

然后,找到在搜索栏中键入的名称的索引路径。

NSUInteger selectedIndex = [nameArray indexOfObject:searchBarText];

使用 Selected index value ,您可以从您通过 ObjectAtIndex 命名的响应数组中获取它。

【讨论】:

我添加了一个新的编辑,请检查一下我不知道如何继续【参考方案2】:

包括 UISearchBarDelegate 并实现其委托方法。

假设你有

@property (strong, nonatomic) NSArray rows;
@property (strong, nonatomic) NSArray resultRows;

然后你用 dogs.json 分配数组,所以现在行包含所有 json 格式的数据。

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",[searchBar text]];

    self.resultRows = [self.rows filteredArrayUsingPredicate:predicate];

    if (self.resultRows.count == 0) 

   //record not found and do stuff

     else 
        //now self.resultRows contains the searched data
    
    [searchBar resignFirstResponder]; 
 

别忘了设置委托。

祝你好运

【讨论】:

你能告诉我你遇到了什么问题吗? 只需将代码中的行替换为 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",[searchBar text]]; 我做了一个新的编辑,请检查一下 试试这个:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR ident CONTAINS[cd] %@",searchBar.text, searchBar.text];

以上是关于如何在 UITableview 中使用 UISearchBar 在本地 JSON 中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableView 中使用多标签?

如何使用删除按钮在 UITableView 中显示重新排序控件

如何在 UITableView 中显示 Core Data 的数据

如何在“搜索”应用程序中使用 UItableView 和 UINavigationController?最佳实践

如何在 .xib 文件中使用自定义 UITableView 和 UITableViewCell?

如何在 UITableview 中对齐标签?