在UISearchController的searchResultsController中没有调用NSFetchedResultsControllerDelegate的方法

时间:2014-06-22 19:35:38

标签: ios objective-c core-data nsfetchedresultscontroller

我正在尝试从UISearchDisplayController迁移到UISearchController,但我很难在我的NSFetchedResultsControllerDelegate中调用UISearchController方法s searchResultsControllerUISearchController被实例化为:

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既是UISearchResultsUpdating又是NSFetchedResultsControllerDelegate。委托方法(未被调用)是来自docs的样板文件。我的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延迟实例化没有更改,也没有要删除的缓存。打印fetchedObjets计数时,计数会更新并且正确。如果我在[self.tableView reloadData]之后抛出一个performFetch,一切看起来都应该如此,但我知道这不是一个好主意。 NSFetchedResultsControllerDelegate的方法不会被调用。是否有其他人看到类似的行为或我是否需要继续挖掘我的代码库?我能找到什么东西?

1 个答案:

答案 0 :(得分:0)

在此处执行的相应操作 ,以便在更改UITableView后调用reloadData' fetchRequest.predicate或添加/删除更改的行。我知道在谓词变更中,管理对象发生变化时会触发NSFetchedResultsControllerDelegate

那么为什么我这么肯定我做错了什么?因为它之前有用,当我使用UISearchDisplayController时,现在我使用UISearchController,它没有用。我没记得的是,我从YES返回了shouldReloadTableForSearchString:,当然,这是reloadData。它之前有效,但不是因为NSFetchedResultsControllerDelegate