我有一个简单的 TableViewController,它有一个添加按钮,可以转到 ModalViewController;用户将文本添加到文本字段中,按保存并关闭,条目将添加到核心数据中的实体和属性并显示在 TableViewController 中。它运作良好。
我首先从另一个按钮开始,该按钮在 TableView 中拉出一个 UISearchBar,我可以搜索结果并将其拉回;那行得通。然后,我在 TableViewController 的底部添加了一个新选项卡,并设法在其中获取搜索栏和表格。
现在,我希望 SearchBar 位于单 TableView 的顶部,并且我希望用户能够键入并动态搜索 TableView。
我的 fetchRequest 目前对于 TableView 看起来像这样(没有搜索栏):
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"occasion.dateOfEvent" ascending:NO selector:@selector(localizedCaseInsensitiveCompare:)];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
[fetchRequest setFetchBatchSize:20];
//NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY whoBy.name CONTAINS[c] %@", self.searchBar.text];
//[fetchRequest setPredicate:pred];
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"occasion.dateOfEvent" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
我正在搜索事务等。现在,这段代码与我的其他具有搜索栏的 View Controller 之间的唯一区别是 NSPredicate 未被注释。搜索效果很好。如果我在这段代码中取消注释,当我运行它时,我会收到以下错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid predicate: nil RHS'
*** First throw call stack:
我明白发生了什么,因为我希望 TableViewController 在没有谓词的情况下显示,但是当我搜索时,我让谓词生效。非常感谢任何有关如何开始这项工作的帮助!
我的搜索栏委托(delegate)方法如下所示:
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error])
{
NSLog(@"Error in search %@, %@", error, [error userInfo]);
} else
{
[self.tView reloadData];
[self.searchBar resignFirstResponder];
[noResultsLabel setHidden:_fetchedResultsController.fetchedObjects.count > 0];
}
}
最佳答案
只有在给定搜索字符串时才应该设置谓词:
if ([self.searchBar.text length] > 0) {
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY whoBy.name CONTAINS[c] %@", self.searchBar.text];
[fetchRequest setPredicate:pred];
}
如果搜索字符串为空,则没有设置谓词,因此返回所有结果。
关于ios - 在我的 TableView 中实现 SearchBar 并使用 NSFetchedResultsController 和适当的谓词来使搜索工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19583185/