在我的TableView中实现一个SearchBar,并使用NSFetchedResultsController和适当的谓词来使search工作

我有一个简单的TableViewController,它有一个添加button,转到一个ModalViewController; 用户将文本添加到文本字段中,按下保存并退出,并将条目添加到Core Data中的Entities and Attributes并显示在TableViewController中。 它运作良好。

我首先用另一个button在桌面视图中拉出一个UISearchBar,然后search结果并将其拉回来; 那工作。 然后,我在TableViewController的底部添加了一个新的选项卡,并设法在那里获得search栏和表格。

现在,我想在单表视图顶部的SearchBar,我希望用户能够键入和dynamicsearchTableView。

我的fetchRequest看起来像这样当前为TableView(没有search栏):

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; 

我正在search交易等。现在,这个代码和我的其他视图控制器有search栏的唯一区别是NSPredicate是未注释的事实。 search很好。 如果我在这个代码中取消注释,当我运行它时,我得到以下错误:

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid predicate: nil RHS' *** First throw call stack: 

我明白发生了什么,因为我希望TableViewController不显示谓词,但是当我search时,我使用谓词来实现。 如何得到这个工作的任何帮助将大大感谢!

我的search栏委托方法如下所示:

 - (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]; } } 

只有在给定searchstring的情况下,才应该设置谓词:

 if ([self.searchBar.text length] > 0) { NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY whoBy.name CONTAINS[c] %@", self.searchBar.text]; [fetchRequest setPredicate:pred]; } 

如果searchstring为空,则不设置谓词,因此将返回所有结果。