14

2 つのプロパティを持つPersonオブジェクトがあります。. 私は現在、次のようなものを使用しています:NSStringfirstName and lastNameNSPredicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(firstName contains[cd] %@) OR (lastName contains[cd] %@)", searchText, searchText];

たとえば、名前を検索しているとします"John Smith"。検索バーに と入力"Joh"するJohn Smithと、オプションとして表示されます。これで問題ありませんが、入力する"John Sm"と空白になります。

firstName と lastName を結合するにはどうpredicateすればよいので、検索していた場合"John Sm"でもJohn Smithオプションとして表示されます。

これが理にかなっていることを願っています。ありがとう。

編集:もう少し明確にするために、SearchDisplayControllerデリゲートメソッドを使用しています:

-(void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope;

そして、私はそのpredicateようなものを使用しています:

newArray = [personObjectArray filteredArrayUsingPredicate:predicate];
4

3 に答える 3

20

これを試して、

NSString *text = @"John Smi";
NSString *searchText = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSArray *array = [searchText componentsSeparatedByString:@" "];
NSString *firstName = searchText;
NSString *lastName = searchText;
NSPredicate *predicate = nil;

if ([array count] > 1) {
    firstName = array[0];
    lastName = array[1];
    predicate = [NSPredicate predicateWithFormat:@"(firstName CONTAINS[cd] %@ AND lastName CONTAINS[cd] %@) OR (firstName CONTAINS[cd] %@ AND lastName CONTAINS[cd] %@)", firstName, lastName, lastName, firstName];
} else {
    predicate = [NSPredicate predicateWithFormat:@"firstName CONTAINS[cd] %@ OR lastName CONTAINS[cd] %@", firstName, lastName];
}

NSArray *filteredArray = [people filteredArrayUsingPredicate:predicate];
NSLog(@"%@", filteredArray);

出力:

(
        {
        firstName = John;
        lastName = Smith;
    }
)

ここで、text は検索されたテキストを表します。上記の利点は、text = @"Smi Joh";ortext = @"John ";またはtext = @" smi";orを渡してもtext = @"joh smi ";、上記の出力が表示されることです。

于 2012-12-21T06:31:03.310 に答える