Cocoa NSString*谓词格式化如何搜索两个实体

Cocoa NSString*谓词格式化如何搜索两个实体,cocoa,predicate,uisearchdisplaycontroller,Cocoa,Predicate,Uisearchdisplaycontroller,大家好,很抱歉问了这个愚蠢的问题,但我想我可能错过了一些简单的东西,自己也弄不明白 我正在尝试使用以下代码搜索表视图: - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { NSString *predicateFormat = @"(name contains[c] %@) O

大家好,很抱歉问了这个愚蠢的问题,但我想我可能错过了一些简单的东西,自己也弄不明白

我正在尝试使用以下代码搜索表视图:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{

    NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString];
    self.fetchedResultsController = [self resetFetchedResultsController:predicate cached:NO];

    NSError *error = nil;
    [self.fetchedResultsController performFetch:&error];

    // Return YES to cause the search result table view to be reloaded.
    return YES;
}
我想实现的是,当用户搜索表时,不仅可以按“名称”搜索,还可以按“年龄”搜索

上面的“我的代码”只搜索“名称”

我错过了一些简单的东西吗

感谢您抽出时间来,而不是:

NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString];
您有三种选择:

NSString *predicateFormat = @"(name contains[c] %@) OR (age contains[c] %@)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString, searchString];
或:

或:


如果您正在构建一个具有未知替换数的大型谓词,那么第三个选项很好。第二种可能是最简单的不重复,但第一种最容易理解。

谢谢!太好了!谢谢你抽出时间回答我的问题!珍宝:澄清一下:原始代码使用了两个格式说明符,但只提供了一个对象。这不仅不起作用,而且可能会崩溃。第一种解决方案提供了与格式说明符一样多的参数;第二个解决方案提供一个参数,并引用两个格式说明符的第一个参数;第三个使用字典而不是参数列表,并按名称(字典键)引用参数。谢谢!当您对这一点非常陌生,并且从未接受过适当的培训时,很难编写代码并理解每行代码背后的内容。我觉得自己像个瞎子在四处摸索。。。然而,在开发者、苹果工程师等的帮助下,我开始“看到”隧道尽头的曙光。我有很长的路要走,但我不会放弃,也不会停止阅读和提问。非常感谢。
NSString *predicateFormat = @"(name contains[c] %1$@) OR (age contains[c] %1$@)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat, searchString];
NSString *predicateFormat = @"(name contains[c] $SEARCH) OR (age contains[c] $SEARCH)";
NSPredicate *template = [NSPredicate predicateWithFormat:predicateFormat];
NSPredicate *predicate = [template predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:searchString forKey:@"SEARCH"]];