2012-07-24 37 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. 

希望这是你在找什么。