3

我正在尝试在我的应用程序中实现可搜索的表格视图,当有人可以搜索位置并获得结果时。它看起来像这样:

在此处输入图像描述

我从基因组.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";
},

我想要做的是如果“fcl”(在数组中看到)等于 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;
}
4

4 回答 4

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

注意filterTableViewbool 值,这是为了让您的 tableView 知道是正常加载还是您刚刚制作的过滤版本。你实现这个:

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

希望这就是你要找的。

于 2012-07-24T22:38:00.843 回答
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];
  }
}
于 2012-07-24T23:31:36.887 回答
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];
  }
}

然后每个单元格将从新数组中获取其值。

于 2012-07-24T22:36:44.090 回答
0

只需将您的 json 放入 NSDictionary 中,然后简单地执行以下操作:

if ([[yourJson objectForKey:@"fcl"] stringValue] == @"A")
    //doSomething
于 2012-07-24T22:36:30.480 回答