0

我有一个简单的 TableViewController,它有一个添加到 ModalViewController 的按钮;用户将文本添加到文本字段中,按保存并关闭,条目将添加到核心数据中的实体和属性并显示在 TableViewController 中。它运作良好。

我首先从另一个按钮开始,该按钮在表格视图中拉出 UISearchBar,我可以搜索结果并将其拉回;那行得通。然后,我在 TableViewController 的底部添加了一个新选项卡,并设法在其中获取了搜索栏和表格。

现在,我希望 SearchBar 位于 Single Table View 的顶部,并且我希望用户能够键入并让它动态搜索 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;

我正在搜索事务等。现在,此代码与我的其他具有搜索栏的视图控制器之间的唯一区别是 NSPredicate 未注释。搜索效果很好。如果我在这段代码中取消注释,当我运行它时,我会收到以下错误:

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

我明白发生了什么,因为我希望 TableViewController 显示没有谓词,但是当我搜索时,我让那个谓词生效。任何有关如何进行这项工作的帮助将不胜感激!

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

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

1 回答 1

2

仅当给出搜索字符串时才应设置谓词:

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

如果搜索字符串为空,则不设置谓词,因此返回所有结果。

于 2013-10-25T07:15:57.733 回答