Ios NSFetchedResultsControllerDelegate';在UISearchController';s searchResultsController
我正在尝试从Ios NSFetchedResultsControllerDelegate';在UISearchController';s searchResultsController,ios,objective-c,core-data,nsfetchedresultscontroller,Ios,Objective C,Core Data,Nsfetchedresultscontroller,我正在尝试从UISearchDisplayController迁移到UISearchController,但是我很难在我的UISearchController的searchresultscoontroller中调用nsfetchedresultscoontrollerdelegate的方法UISearchController被实例化为: self.searchController = [[UISearchController alloc] initWithSearchResultsControl
UISearchDisplayController
迁移到UISearchController
,但是我很难在我的UISearchController
的searchresultscoontroller
中调用nsfetchedresultscoontrollerdelegate
的方法<代码>UISearchController被实例化为:
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsViewController];
self.searchController.searchResultsUpdater = self.searchResultsViewController;
self.searchController.searchBar.frame = CGRectMake(0.0, 0.0, 320.0, 44.0); /* radr://17315477 */
self.tableView.tableHeaderView = self.searchController.searchBar;
self.definesPresentationContext = YES;
searchResultsController
是一个相当简单的样板文件UITableViewController
(self.searchResultsViewController
)。UITableViewDataSource
方法都是从我的旧UISearchDisplayController
复制过来的。例如:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return (self.searchFetchedResultsController.sections.count);
}
UITableViewController
既是uisearchresultsupdated
又是NSFetchedResultsControllerDelegate
。委托方法(没有被调用)是文档中的样板文件。我的updateSearchResultsForSearchController:
也非常基本:
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
if (!searchController.isActive)
return;
self.searchFetchedResultsController.delegate = self;
self.searchFetchedResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", @"name", searchController.searchBar.text];
NSError *error = nil;
if (![self.searchFetchedResultsController performFetch:&error])
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
NSLog(@"%@", @([self.searchFetchedResultsController.fetchedObjects count]));
}
我现在每次都设置委托,因为我的问题是在
performFetch
之后不会调用委托方法。我真的不知道还能看什么。我已经在调试器中确认委托在之前和之后都被设置,并且它被设置为正确的对象。searchFetchedResultsController
lazy实例化未更改,并且没有要删除的缓存。打印fetchedObjets计数时,计数会更新并且是正确的。如果我在性能测试
之后抛出[self.tableView reloadData]
,一切看起来都是应该的,但我知道这不是一个好主意NSFetchedResultsControllerDelegate
的方法没有被调用。是否有其他人看到类似的行为,或者我需要继续挖掘我的代码库?我可以查找哪些内容?此处要做的适当操作是调用UITableView
的重新加载数据
,或者在更改fetchRequest.predicate
后添加/删除更改的行。我知道NSFetchedResultsControllerDelegate
s在托管对象的更改时触发,而不是在谓词的更改时触发
那为什么我这么肯定我做错了什么?因为它以前工作过,当我使用UISearchDisplayController
时,现在使用UISearchController
时,它就不工作了。我没有回忆起的是,我正在从shouldReloadTableForSearchString:
返回YES
,当然,它调用reloadData
。它以前工作过,但不是因为NSFetchedResultsControllerDelegate