РЕДАКТИРОВАТЬ:
Я только что нашел: Как перейти от результата UISearchBarDisplayController к детальвиевконтроллер
на что я посмотрю!
Я комбинирую «панель поиска и контроллер отображения поиска» с основными данными fetchedResultsController, используя раскадровку. То есть я должен различать:
if (self.tableView == self.searchDisplayController.searchResultsTableView) {
...
и случай, когда я только что перечислил результаты, полученные из хранилища данных.
Однако у меня возникли проблемы с получением правильной строки (индексного пути) в следующем случае:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"StoreDetails"]) {
UINavigationController *navigationController = segue.destinationViewController;
StoreDetailsTableViewController *controller = (StoreDetailsTableViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
Store *storeToDetail = nil;
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; // This gives wrong row when having searched using searchDisplayController
NSLog(@"Row: %i", indexPath.row); // row is always 0
if (self.tableView == self.searchDisplayController.searchResultsTableView) {
storeToDetail = [self.filteredListContent objectAtIndex:indexPath.row];
} else {
storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
}
controller.storeToDetail = storeToDetail;
}
}
который вызывается после:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString scope:@"All"];
...
с:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
[self.filteredListContent removeAllObjects];
for (Store *store in [self.fetchedResultsController fetchedObjects])
{
if ([scope isEqualToString:@"All"] || [store.name isEqualToString:scope])
{
NSComparisonResult result = [store.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
{
[self.filteredListContent addObject:store];
}
}
}
}
который взят из примера Apple TableSearch.
Исходная проблема двояка:
1) кажется, что self.tableView не равен self.searchDisplayController.searchResultsTableView — это prepareForSegue
2) после поиска indexPath (строка) всегда равен 0.
Я полагаю, что мог бы использовать didSelectRow... вместо этого или в сочетании, но я считаю, что подготовка... должна быть возможна?! Кроме того, при экспериментировании с didSelectRow... Я уверен, как передать объект из соответствующей строки в контроллер назначения. То есть я могу получить правильный indexPath в didSelectRow... но я знаю только, как получить назначение перехода в preparFor...:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Store *storeToDetail = nil;
if (tableView == self.searchDisplayController.searchResultsTableView)
{
storeToDetail = [self.filteredListContent objectAtIndex:indexPath.row];
}
else
{
storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
}
// How to get segue destination controller and set object?!
// Before doing:
[self performSegueWithIdentifier:@"StoreDetails" sender:self];
}
Буду признателен за любую оказанную помощь. Может быть, ссылка на учебник, который показывает, как комбинировать эти вещи.
Благодарю вас!