【问题标题】:Filtering an NSArray from JSON?从 JSON 中过滤 NSArray?
【发布时间】:2012-07-23 07:40:24
【问题描述】:

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

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

【问题讨论】:

  • 如果您没有得到大量结果,那么最简单的方法可能就是丢弃您不想要的结果。 IE:让 JSON 解析器完成它,遍历结果并将感兴趣的记录复制到新的 NSMutableArray。
  • @rhooligan 我很乐意这样做......除了我不太确定该怎么做:P。指出正确的方向会很棒,谢谢!
  • 你走了多远?您是否能够让解析器返回 NSDictionary 对象或类似对象的 NSArray?
  • 解决这个问题的关键是认为每个 UITableView 背后都应该有一个核心索引数据模型(例如 NSArray),其中 indexpath 之间总是存在直接关系 - 这样你的UITableViewDelegate 代码变得简单。在这种情况下,当搜索文本更改时,您会重新计算此数组。当搜索被取消并且您想返回显示所有条目时,您应该保持原始数据源不变。

标签: iphone objective-c ios json filter


【解决方案1】:

您的问题基本上是,如何从搜索栏字符串中过滤您的数组?如果是这样,您可以通过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 bool 值,这是为了让您的tableView 知道是正常加载还是您刚刚制作的过滤版本。您在以下位置实现:

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

希望这就是您想要的。

【讨论】:

    【解决方案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];
      }
    }
    

    【讨论】:

    • 非常感谢!在对代码进行了几次编辑后,它完美地完成了!
    【解决方案3】:

    所以每次搜索字段发生变化时,您都会计算一个新数组,然后重新加载您的 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];
      }
    }
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多