2012-07-24 38 views
3

我試圖在我的應用程序中實現可搜索的tableview,當有人可以搜索某個位置並獲得結果時。它看起來是這樣的:從JSON過濾NSArray?

enter image description here

我從genomes.com這使得更多的則只是城市讓我的消息來源,它也有公園,建築物,縣,等我想只顯示其位置是城市。

數據是由JSONKit解析的JSON文件。整個文件進入(最多20個對象),然後可搜索的表格視圖顯示它。我不確定是否應該以不同的方式解析JSON文件,或者如果我應該讓表視圖僅顯示需要的結果。 (在這種情況下的性能不是問題。)。 JSON文件被轉換爲NSArray。

這裏是陣列的一部分:

{ 
    adminCode1 = MA; 
    adminCode2 = 027; 
    adminName1 = Massachusetts; 
    adminName2 = "Worcester County"; 
    adminName3 = ""; 
    adminName4 = ""; 
    adminName5 = ""; 
    continentCode = NA; 
    countryCode = US; 
    countryName = "United States"; 
    elevation = 178; 
    fcl = A; 
    fclName = "country, state, region,..."; 
    fcode = ADMD; 
    fcodeName = "administrative division"; 
    geonameId = 4929431; 
    lat = "42.2000939"; 
    lng = "-71.8495163"; 
    name = "Town of Auburn"; 
    population = 0; 
    score = "53.40083694458008"; 
    timezone =   { 
     dstOffset = "-4"; 
     gmtOffset = "-5"; 
     timeZoneId = "America/New_York"; 
    }; 
    toponymName = "Town of Auburn"; 
}, 

我想要做的是,如果「整箱」(數組中看到的)等於P,那麼我希望它表明,在表視圖。如果「fcl」是其他角色,那麼我不希望它在表格視圖中看到。我很確定if語句可以做到這一點,但我不知道如何得到它,以便過濾它的一部分。

任何幫助,將不勝感激!由於

編輯:截至目前,這是代碼搜索:

- (void)delayedSearch:(NSString*)searchString 
{ 
    [self.geoNamesSearch cancel]; 
    [self.geoNamesSearch search:searchString 
         maxRows:20 
         startRow:0 
         language:nil]; 
} 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    self.searchDisplayController.searchBar.prompt = NSLocalizedStringFromTable(@"ILGEONAMES_SEARCHING", @"ILGeoNames", @""); 
    [self.searchResults removeAllObjects]; 

    // Delay the search 1 second to minimize outstanding requests 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    [self performSelector:@selector(delayedSearch:) withObject:searchString afterDelay:0]; 

    return YES; 
} 
+0

如果你沒有收到大量的結果,那麼最簡單的方法可能就是放棄你不想要的結果。 IE:讓JSON解析器做它的事情,循環遍歷結果並將感興趣的記錄複製到新的NSMutableArray中。 – Brian 2012-07-24 22:28:42

+0

@rhooligan我很樂意這樣做......除非我真的不知道該怎麼做:P。正確的方向將是偉大的,謝謝! – sridvijay 2012-07-24 22:30:31

+0

你有多遠?你是否能夠讓解析器返回一個NSArray對象或類似的NSArray? – Brian 2012-07-24 22:33:04

回答

2
NSMutableArray* filtered = [[NSMutableArray alloc] autorelease]; 

for (int i=0;i<[data count];i++) 
{ 
    NSDictionary* item=[data objectAtIndex:i]; 

    if (@"P" == [item objectForKey:@"fcl"]) 
    { 
    [filtered addObject:item]; 
    } 
} 
+0

非常感謝!這對代碼進行了幾次編輯後完美無缺! – sridvijay 2012-07-25 02:05:30

0

只要把你的JSON在NSDictionary中,只是這樣做:

if ([[yourJson objectForKey:@"fcl"] stringValue] == @"A") 
    //doSomething 
1
每次

所以搜索字段更改,您將計算一個新的數組,然後重新加載您的tableview。行數將是過濾數組中的行數。

要計算新的數組,你可以這樣做(假設字典數組):

NSString *searchString; // from the search field 
NSMutableArray *array = [NSMutableArray arrayWithCapacity:[origArray count]]; 
for(NSDictionary *dict in origArray) { 
    NSString *val = [dict objectForKey:@"fcl"]; 
    if([val length] >= searchString) { 
    NSString subString = [val substringToIndex:[searchString length]]; 
    if([subString isEqualToString:val]) [array addObject:dict]; 
    } 
} 

然後,每個細胞會得到其在新數組值。

3

你的問題基本上是,你如何從搜索欄字符串過濾數組?如果是這樣,您可以通過UISearchBarDelegate檢測文本何時更改,然後通過陣列複製包含您正在查找的字符串的對象,即

這是您想要的代表方法:searchBar:textDidChange:

[filterArray removeAllObjects]; 
for(int i = 0; i < [normalArray count]; i++){ 
    NSRange textRange; 
    textRange =[[[[normalArray objectAtIndex:i] objectForKey:@"name"] lowercaseString] rangeOfString:[searchBarString lowercaseString]]; 
    //I wasn't sure which objectForKey: string you were looking for, just replace the one you want to filter. 
     if(textRange.location != NSNotFound) 
     { 

     [filterArray addObject:[normalArray objectAtIndex:i]]; 

     } 
} 

filterTableView = YES; 
[tableView reloadData]; 

注意filterTableView布爾值,這是爲了確保你的tableView知道無論是正常加載或您剛纔提出的過濾版本。你實現這個在:

tableView:numberOfRowsInSection: //For number of rows. 
tableView:cellForRowAtIndexPath: //For the content of the cells. 

希望這是你在找什麼。