我正在尝试从UISearchDisplayController
迁移到UISearchController
,但我很难在我的NSFetchedResultsControllerDelegate
中调用UISearchController
方法s searchResultsController
。 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
既是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
的方法不会被调用。是否有其他人看到类似的行为或我是否需要继续挖掘我的代码库?我能找到什么东西?
答案 0 :(得分:0)
在此处执行的相应操作 ,以便在更改UITableView
后调用reloadData
' fetchRequest.predicate
或添加/删除更改的行。我知道在谓词变更中,管理对象不发生变化时会触发NSFetchedResultsControllerDelegate
。
那么为什么我这么肯定我做错了什么?因为它之前有用,当我使用UISearchDisplayController
时,现在我使用UISearchController
,它没有用。我没记得的是,我从YES
返回了shouldReloadTableForSearchString:
,当然,这是reloadData
。它之前有效,但不是因为NSFetchedResultsControllerDelegate
。