在NSMutableArray中搜索NSString

3

这可能是许多现有问题的重复,其中之一是: 此链接

或者其他我迄今为止搜索到的链接。

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

我通过xml获取这些数据。从解析中提取后放入NSMutableArray中,并在我的表视图中显示详细信息。

我想对这个数组中的People NAME应用搜索功能。

如何从中获取People Names?

这是我使用的代码:

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

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

对于获取结果,我发现只能从可变数组中搜索字符串,因此我按以下方式进行了搜索:

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

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

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

我该怎么做?

有什么解决方法吗?

我需要完成这个任务,但不知道怎么做!!

请帮忙!


如果您成功实现了这个功能,那么语句 self.filteredArray = self.arrayPeoples; 的意思是 arrayPeoples 数组将具有与 filteredArray 相同的内容。这是您的意图吗?(如果是,为什么还要进行赋值操作呢?) - Phillip Mills
我想在过滤后的数组上应用搜索,而不是在数组people上进行搜索,因为每当BOOL IsSearching为ON时,表格都会通过过滤后的数组重新加载。 - NSException
我的观点是,你的赋值语句使得这两个变量指向同一个对象。 - Phillip Mills
我只想通过实际数组来填充过滤后的数组,因为如果使用搜索,则将使用已过滤的数组,否则将使用People数组重新加载表格。还有其他方法可以这样做吗? - NSException
4个回答

3

最终,我放弃了使用搜索来匹配字符串名称和搜索文本的想法,如果名称包含搜索文本,则将该数组索引添加到筛选后的数组中。

以下是相同的代码:

   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;

0

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

这里没有人知道它们是什么。听起来像是你超出了自己的能力范围,并且在请求我们帮你编写应用程序,而不是先尝试自己解决问题。

花些时间阅读(并理解)苹果的文档,例如 NSArrayNSPredicate。阅读你正在使用的类的文档来解析你的 XML。逐步分析你的代码以理解它在做什么。如果有必要,添加一些 NSLog。也许编写一个仅用于解析你的 XML 的测试应用程序会有所帮助。

然后当你完成所有这些,并且仍然不理解时,请回来请求帮助。


问题已编辑。请告诉我是否有任何代码片段或其他方法可以实现按名称搜索。由于数组具有人员信息的解析详细信息,因此我想在其中一个人的姓名上应用搜索,而不是电话号码、位置或其他任何内容!请帮帮我! - NSException

0

使用 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 rangeOfString:options:]: 无法识别的选择器发送到实例0x85991c0。 - NSException
你的数组里有什么样的对象?由于你将它们与字符串进行比较,因此可能会认为那是你放置在那里的内容,但是那个错误看起来并不像是真的。 - Phillip Mills
解析项目。我正在通过解析填充数组。 - NSException
什么是“Parsing Item”?它是一个字典吗?还是一个自定义模型类? - Ashley Mills
@Iphony 当您打印出filteredArray时会发生什么? - ThomasW
我在nslog中获取到以下数值: "<ParsingItem: 0x82a7fc0>", "<ParsingItem: 0x82a8610>", "<ParsingItem: 0x82a8aa0>", "<ParsingItem: 0x82a8f30>", "<ParsingItem: 0x82a93c0>", "<ParsingItem: 0x82a9850>", "<ParsingItem: 0x82a9ca0>", "<ParsingItem: 0x82aa220>"。我知道这不是从一个包含多个值的可变数组中获取NSString的正确方法,请建议我正确的过程。 - NSException

0
根据您对Ashley Mills答案的评论,似乎您的数组不包含字符串。 contains谓词运算符仅适用于字符串 - 对于ParsingItems而言没有任何意义,除非ParsingItem是一种字符串类型。
基于您在编辑中添加的代码所暗示的ParsingItem结构(其中您的数组包含ParsingItems,要搜索的字符串是该ParsingItem的mdictXMLTagsData属性中的UserName属性),您的谓词应该类似于这样:
[NSPredicate predicateWithFormat:@"mdictXMLTagsData.UserName contains[c] %@", self.strSearchingText]

我知道这不是从一个可变数组中获取多个值的NSString的正确方法,请建议我正确的过程。 - NSException
@Iphony:每个索引处并不具有多个值,而是每个索引处都有一个值,该值是一个ParsingItem。如果您想从解析项中获取属性,则必须这样做。您没有提供足够的关于您的类或意图的信息,以便我们告诉您更多信息。 - Chuck
问题已编辑,你能帮我吗! - NSException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接