如何为NSPredicate连接两个字符串,即firstname和lastname

Dav*_*d P 14 iphone objective-c nsstring nspredicate ios

我有一个Person具有两个NSString属性的Object ; firstName and lastName.我目前正在使用NSPredicate这样的:

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

所以,例如,说我正在寻找这个名字"John Smith".在我的搜索栏中,如果我输入"Joh",John Smith则会显示为选项.这很好,但如果我输入"John Sm"它将变为空白.

我如何加入firstName和lastName,predicate如果我正在搜索,"John Sm"那么John Smith仍然会显示为一个选项.

我希望这是有道理的.谢谢.

编辑:为了进一步澄清,我正在使用SearchDisplayController委托方法:

-(void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope;
Run Code Online (Sandbox Code Playgroud)

我正在使用predicate这样的:

newArray = [personObjectArray filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

iDe*_*Dev 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);
Run Code Online (Sandbox Code Playgroud)

输出:

(
        {
        firstName = John;
        lastName = Smith;
    }
)
Run Code Online (Sandbox Code Playgroud)

这里的文字代表搜索到的文字.上述优点是,即使你通过text = @"Smi Joh";text = @"John ";text = @" smi";text = @"joh smi ";,它仍将显示上述输出.

  • 这不起作用.例如,如果用户键入John Smith等等,它将显示John Smith.这在代码中很明显,因为一旦字符串组件超过1([数组计数]> 1),您仍然只使用数组[0]和数组[1].最好的解决方法是在对象中实现方法fullname(如果它是nsmanagedobject,则为类别),然后使用predicateWithBlock. (2认同)