ios - 在我的 TableView 中实现 SearchBar 并使用 NSFetchedResultsController 和适当的谓词来使搜索工作

标签 ios uitableview core-data predicate searchbar

我有一个简单的 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/

相关文章:

ios - backBarButtonItem有长文本时显示 "..."

ios - "Scan now to download"iPhone App 下载二维码

ios - 使用核心数据和获取请求来更新一条数据

ios - 如何使用 NSPredicate 从 CoreData 中删除选定数量的行?

iphone - NSFetchedResultsController 索引超出范围

objective-c - UILabel 中文本前面的垂直线。喜欢 block 引用

ios - 想要从下拉列表中选择选项并根据所选选项更改按钮标题...如何?

ios - UITableViewRowAction - 保留单元格的文本

ios - 在哪里设置 subview 的图层属性?为什么不在 initWithCoder 中

ios - swift didSelectAtIndexPath 不会被触发