2017-05-11 18 views
0

これはほぼ3日間続きましたが、私はまだバグを修正できません。シンプルな状況で、私は人の名前(名前と姓)を検索したいと思います。NSPredicateを使用して検索 - フルネーム

例:

  • その後、私は(結果:何も)の後に空白でジョンを書く私は続ける。その後
    1. まず、私はジョン(ジョン・ニューマン、安定ジョン、ジョンCarensで結果を)書きますジョンNと(結果:ジョンニューマン)。検索に空白を入れても、 の名前を表示する必要があります。

    これはif/elseの最初の部分で、2+語の配列で動作します。おかげ

    - (void)searchForText:(NSString*)searchText 
    { 
    NSString *searchTextt = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
    
         NSArray *array = [searchTextt componentsSeparatedByString:@" "]; 
    
    
         NSString *firstName = searchTextt; 
         NSString *lastName = searchTextt; 
         NSString *firstName2 = searchTextt; 
         NSString *lastName2 = searchTextt; 
    
         NSPredicate *predicate = nil; 
    
        if ([array count] > 1) { 
         firstName = array[0]; 
         lastName = array[1]; 
         firstName2 = array[1]; 
         lastName2 = array[0]; 
    
         predicate = [NSPredicate predicateWithFormat:@"(guestName CONTAINS[cd] %@ AND guestSurname CONTAINS[cd] %@)", firstName, lastName]; 
         NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"(guestSurname CONTAINS[cd] %@ AND guestName CONTAINS[cd] %@)", lastName2, firstName2]; 
    
         NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate, predicate2]]; 
    
    
         self.searchResults = [self.mainarray filteredArrayUsingPredicate:compoundPredicate]; 
    
        } else { 
         NSPredicate *predicate = [NSPredicate predicateWithFormat:@"guestSurname contains[cd] %@", searchText]; 
         NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"guestName contains[cd] %@", searchText]; 
         NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"guestCompany contains[cd] %@", searchText]; 
    
    
         NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predicate, predicate2, predicate3]]; 
         self.searchResults = [self.mainarray filteredArrayUsingPredicate:compoundPredicate]; 
    
        } 
    
    
    } 
    

    EDIT


    - (void)updateSearchResultsForSearchController:(UISearchController *)searchController 
    { 
        NSString *searchString = searchController.searchBar.text; 
        [self searchForText:searchString]; 
        [_maintable reloadData]; 
    } 
    
  • +0

    余分なスペースがある場合は、空の文字列を 'array'の2番目の値として取得します。あなたはその特別なケースに対処する必要があります。または、文字列の先頭と末尾の空白をトリムします(スペースで始めると失敗するため)。http://stackoverflow.com/questions/5756256/trim-spaces-from-end -of-a-nsstring –

    +0

    こんにちは、ありがとうございました。コードでいくつか例を挙げてください。どうもありがとうございます@GerdK –

    答えて

    0

    私は

    (様配列{ guestName =ジョン; guestSurname =ニューマン;}、{ guestName = John; gue stSurname =安定です。 }、{ guestName = John; guestSurname = Carens; })

    私はのfuction

    - (void)searchForText:(NSString*)searchText 
        { 
         searchTextt = [searchText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
         NSArray *array = [searchTextt componentsSeparatedByString:@" "]; 
         NSString *firstName = searchTextt; 
         NSString *lastName = searchTextt; 
         NSPredicate *predicate = nil; 
    
         if ([array count] > 1) { 
          firstName = array[0]; 
          lastName = array[1]; 
          predicate = [NSPredicate predicateWithFormat:@"(guestName CONTAINS[cd] %@ AND guestSurname CONTAINS[cd] %@) OR (guestName CONTAINS[cd] %@ AND guestSurname CONTAINS[cd] %@)", firstName, lastName, lastName, firstName]; 
    
         } else { 
          predicate = [NSPredicate predicateWithFormat:@"guestName CONTAINS[cd] %@ OR guestSurnamen CONTAINS[cd] %@", firstName, lastName]; 
    
         } 
         NSArray *arrResult = [arr filteredArrayUsingPredicate:predicate];; 
    
        } 
    
    - (void)updateSearchResultsForSearchController:(UISearchController 
    *)searchController 
    { 
        NSString *searchString = searchController.searchBar.text; 
        [self searchForText:searchString]; 
        [_maintable reloadData]; 
    } 
    

    を書くには、これを試してみてください。テキストフィールドに「john」と入力すると結果が得られます。

    +0

    ありがとうございました。私は現在、検索を更新する方法を呼び出す場所を知らないので、テキストフィールドでそれを行いました。私の編集を確認できますか? –

    +0

    @MilanWorsch私は自分の答えを更新しました。それを確認してください。それがうまくいくなら、私の解決策を受け入れるか、upvoteしてください。 – kb920

    +0

    これは私の質問の冒頭に書いたのと同じコードです。私が検索バー「ジョン」に書き込んだ場合、結果はありません - ミラノ・ウォルシュ10分前 –

    関連する問題