2015-06-19 48 views
0

我開發有狗在以.json如何使用UITableview中的UISearchBar在本地JSON中獲取數據?

我能夠獲取在泰伯維所有數據的本地數據庫的應用程序和它完美的作品如下:

-(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]; 
} 

現在我的目標是通過一個搜索欄實現SEARCH系統,該搜索欄允許我直接在JSON文件中查找數組。這是JSON的配置:

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

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

    }, 


} 

我想,當在搜索欄寫洛基......它讓我看到陣列中的所有信息。

我說這種搜索方式:

#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]; 

//我想獲得也與狗 「標識」 的細節;
//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)當我在搜索欄搜索洛基我只得到含有細胞:

洛基但不是的ident

我的新目標

有一種方法在搜索後的單元格中同時獲得「ident &名稱」?

回答

1

包含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]; 
} 

並且不要忘記設置代表。 。

好運

+0

我剛試過!它不起作用:( – Kingofmit

+0

你能告訴我你面臨什麼問題嗎? –

+0

只需將代碼中的行替換爲 NSPredicate * predicate = [NSPredicate predicateWithFormat:@「name CONTAINS [cd] **%@ **」 [搜索欄文本]; –

1
@property (strong, nonatomic) NSMutableArray nameArray; 

@property (strong, nonatomic) NSMutableArray responseArray; 

首先存儲在單獨陣列的名稱值(如果名稱是唯一的)

對(INT I = 0;我< responseArray。計數;我++){

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

}

//名數組:( 洛基, 山姆, 阿倫 ) // SearchBarText - @ 「薩姆」

然後,找到在搜索欄中鍵入的名稱的索引路徑。

NSUInteger selectedIndex = [nameArray indexOfObject:searchBarText]; 

使用選定的索引值,您可以從響應數組中獲取您通過ObjectAtIndex取名的地方。

+0

凡把最後的命令「NSUInteger的SelectedIndex」 ??? – Kingofmit

+0

後循環就可以把該行的代碼 –

+0

我把一個新的編輯,請檢查出來我也不怎麼繼續前進 – Kingofmit

相關問題