如何在 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 中显示 Core Data 的数据
如何在“搜索”应用程序中使用 UItableView 和 UINavigationController?最佳实践