在 NSMutableArray 中搜索 NSString


这可能是

许多现有问题的重复,其中之一是:这

或我到目前为止搜索过的其他链接。

我正在开发一个应用程序,在其中显示人员信息,例如他们的位置,姓名,图像,性别,电话号码等。

我正在通过 xmls 获取这些数据。通过解析,我输入我的 NSMutableArray 并在表视图上显示详细信息。

我想在此数组中对人员姓名应用搜索。

如何从中获取人名?

这是我使用的代码:

要在表视图中显示详细信息:

 if (cell == nil) 
 {
   NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellDetail" owner:self options:nil];
   id firstObject =[topLevelObjects objectAtIndex:0];
   if ( [ firstObject isKindOfClass:[UITableViewCell class]] )
    cell = (CustomCellDetail *)firstObject;
     ParsingItem *item=[self.arrayPeoples objectAtIndex:indexPath.section];
     cell.lblUserName.text=[item.mdictXMLTagsData valueForKey:@"UserName"];
     cell.lblStatus.text=[item.mdictXMLTagsData valueForKey:@"StatusMessage"];
     cell.lblAge.text=[item.mdictXMLTagsData valueForKey:@"Gender"];

为了获取结果,我发现只能从 nsmutable 数组中搜索字符串,所以我应用了如下搜索:

  -(void)FetchSearcheRecordsFromArray
  {
      self.filteredArray = self.arrayPeoples;
      NSLog(@"string :%@",strSearchingText);
      NSPredicate *Predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",self.strSearchingText];
      NSLog(@"string :%@",Predicate);
      [self.filteredArray filterUsingPredicate:Predicate];
      NSLog(@"Array count is : %d",[self.filteredArray count]);
      if ([self.filteredArray count] <= 0 )
      {
           self.lblNoRecordsFound.hidden = NO;
      }
      else 
      {
           self.lblNoRecordsFound.hidden = YES;
      }
      [self.tblViewPeople reloadData];
  }

我的应用程序在线崩溃:

[self.filteredArray filterUsingPredicate:Predicate];

据我所知,我的数组中不存在该字符串,并且有一个解析项。

我只想对人名应用搜索,但我不知道如何从数组中获取仅姓名。

我怎样才能实现这个???

有什么解决方法吗??

我需要这样做,但不知道如何!!

请帮忙!

最后,我放弃了应用搜索并将字符串名称与搜索的文本匹配的想法,如果 Name 包含搜索的文本,则该数组索引将添加到过滤数组中。

这是相同的代码:

   NSPredicate *Predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",self.strSearchingText];
   NSLog(@"string :%@",Predicate);
   NSLog(@"arrayPeoples count is : %d",[self.arrayPeoples count]);
   NSMutableArray *arrSearch = [[NSMutableArray alloc] init];
   for (int i = 0; i < [self.arrayPeoples count];i++ ) 
   {
       ParsingItem *item = [self.arrayPeoples objectAtIndex:i];
       NSString * strUserName = [item.mdictXMLTagsData valueForKey:@"UserName"];
       if ([strUserName rangeOfString: strSearchingText options: NSCaseInsensitiveSearch].location != NSNotFound)
       {
           NSLog (@"Yay! '%@' found in '%@'.", self.strSearchingText, strUserName);
           [arrSearch addObject:item];
       }   
   }
   self.filteredArray = arrSearch;

如何使用enumerateObjectsUsingBlock:方法:

self.lblNoRecordsFound.hidden = YES;
[self.filteredArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj rangeOfString: strSearchingText options: NSCaseInsensitiveSearch].location != NSNotFound) {
        self.lblNoRecordsFound.hidden = NO;
        *stop = YES;
    }
}];

这假定数组包含字符串(代码示例指示的字符串)。根据您在下面的评论,情况并非如此。

好的,所以你有一个ParsingItem数组。

这里没有人知道它们是什么。在我看来,这听起来像是你高高在上,要求我们编写你的应用程序,而不是先尝试太多。

花一些时间 - 阅读(并理解)苹果关于NSArray的文档,NSPredicate。阅读有关用于分析 XML 的类的文档。逐步浏览代码以了解其作用。如果有帮助,请添加一些NSLog。也许编写一个测试应用程序,它只解析您的 XML。

然后,当你完成了所有这些,如果你仍然不明白,请回来寻求帮助。

根据您对 Ashley Mills 答案的评论,您的数组似乎不包含字符串。contains谓词运算符仅用于处理字符串 — 除非 ParsingItem 是一种字符串,否则它对 ParsingItems 没有任何意义。

根据您在编辑中添加的代码所隐含的 ParsingItem 结构(其中数组包含 ParsingItems,并且要搜索的字符串是该 ParsingItem 的 mdictXMLTagsData 属性中的 UserName 属性),您的谓词应如下所示:

[NSPredicate predicateWithFormat:@"mdictXMLTagsData.UserName contains[c] %@", self.strSearchingText]

最新更新