【问题标题】:Search NSString in NSMutableArray在 NSMutableArray 中搜索 NSString
【发布时间】:2012-06-01 01:55:19
【问题描述】:

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

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

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

我通过 xmls 获取这些数据。从 Parsing 中,我输入了我的 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];

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

我只想对人的姓名进行搜索,但我不知道如何从数组中只获取姓名。

我怎样才能做到这一点???

有什么解决办法吗??

我需要这样做,但不知道怎么做!

请帮忙!

【问题讨论】:

  • 如果你得到这个工作,语句self.filteredArray = self.arrayPeoples; 意味着arrayPeoples 数组将具有与filteredArray 相同的内容。那是你的意图吗? (如果是这样,为什么还要麻烦分配?)
  • 我的意思是你的赋值语句使两个变量指向同一个对象。
  • 我只想用实际数组填充过滤数组,因为如果使用搜索,将使用过滤数组,否则表格将由人员数组重新加载。还有其他方法吗???
  • 你真的需要 RTFM 老兄

标签: objective-c ios nsstring nsmutablearray nspredicate


【解决方案1】:

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

这是相同的代码:

   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;

【讨论】:

    【解决方案2】:

    使用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;
        }
    }];
    

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

    【讨论】:

    • m 收到此错误:-[ParsingItem rangeOfString:options:]: unrecognized selector sent to instance 0x85991c0
    • 您的数组中有哪些类型的对象?由于您将它们与字符串进行比较,因此可能会认为这就是您放在那里的内容,但该错误看起来并不真实。
    • 解析项目。我正在通过解析填充数组。
    • 什么是“解析项”?是字典吗?自定义模型类?
    • @Iphony 当你打印出过滤数组时会发生什么?
    【解决方案3】:

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

    这里没有人知道它们是什么。在我看来,您好像在想方设法要求我们编写您的应用程序,而不是先自己尝试太多。

    花点时间阅读(并理解)Apple 在NSArrayNSPredicate 上的文档。阅读有关用于解析 XML 的类的文档。逐步检查您的代码以了解它在做什么。如果有帮助,请添加一些 NSLogs。也许编写一个测试应用程序,除了解析你的 XML 之外什么都不做。

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

    【讨论】:

    • 问题已编辑。请让我知道任何代码spinet或一些我可以在名称上实现搜索的东西。作为具有人民信息解析详细信息的数组,我想在其中一个名称上应用搜索。而不是人们的电话号码或位置或其他任何东西!请帮帮我!!
    【解决方案4】:

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

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

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

    【讨论】:

    • 我知道这不是从每个索引都有多个值的可变数组中获取 nsstring 的正确方法,请建议我正确的过程。
    • @Iphony:每个索引都没有多个值。每个索引都有一个值,该值是 ParsingItem。如果要从解析项中获取属性,则必须这样做。您没有提供有关您的课程或您的意图的足够信息,我们无法告诉您更多信息。
    • 问题已编辑,您能帮帮我吗!
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多