3

これは、多くの既存の質問と重複している可能性があります。そのうちの1つは次のとおりです

または私がこれまでに検索した他のリンク。

私は、場所、名前、画像、性別、電話番号などの人情報を表示するアプリケーションに取り組んでいます。

このデータはxmlを介して取得しています。解析から、NSMutableArrayにフィードし、テーブルビューに詳細を表示します。

この配列のPeopleNAMEに検索を適用したいと思います。

これらから人の名前を取得するにはどうすればよいですか?

これが私が使用しているコードです:

テーブルビューに詳細を表示するには:

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

文字列が配列に存在せず、解析項目があることを知っています。

人々の名前だけに検索を適用したいのですが、配列から名前だけを取得する方法がわかりません。

どうすればこれを達成できますか?

回避策はありますか?

私はこれを行う必要がありますが、方法がわかりません!!

助けてください !

4

4 に答える 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;
于 2012-05-30T10:58:04.100 に答える
0

Ashley Millsの回答に対するコメントによると、配列に文字列が含まれていないように見えます。述語演算子は、contains文字列を操作することのみを目的としています。ParsingItemが一種の文字列でない限り、ParsingItemsには意味がありません。

編集で追加したコードによって暗示されるParsingItemの構造に基づいて(配列にParsingItemsが含まれ、検索する文字列がそのParsingItemのmdictXMLTagsDataプロパティのUserNameプロパティである場合)、述語は次のようになります。

[NSPredicate predicateWithFormat:@"mdictXMLTagsData.UserName contains[c] %@", self.strSearchingText]
于 2012-05-28T06:41:14.610 に答える
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;
    }
}];

これは、配列に文字列が含まれていることを前提としています(コードサンプルが示しています)。以下のコメントに基づくと、そうではありません。

于 2012-05-25T13:30:20.000 に答える
0

OK、これでParsingItemsの配列ができました。

ここの誰も彼らが何であるかを知りません。あなたが頭上にいて、最初に自分自身をあまり試さずにアプリを書くように私たちに求めているように私には聞こえます。

NSArray少し時間がかかります- 、に関するAppleのドキュメントを読んで(そして理解して)くださいNSPredicate。XMLの解析に使用しているクラスのドキュメントをお読みください。コードをステップスルーして、コードが何をしているのかを理解します。NSLogそれが役立つ場合は、いくつかを追加します。たぶん、XMLを解析するだけのテストアプリを作成してください。

その後、すべてを行った後、それでも理解できない場合は、戻って助けを求めてください。

于 2012-05-28T10:08:16.767 に答える