prepareForSegue после UISearchDisplayController

РЕДАКТИРОВАТЬ:

Я только что нашел: Как перейти от результата 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];
}

Буду признателен за любую оказанную помощь. Может быть, ссылка на учебник, который показывает, как комбинировать эти вещи.

Благодарю вас!


person marrop    schedule 05.04.2012    source источник


Ответы (3)


В этом случае senderargument prepareForSegue:sender: устанавливается в ячейку табличного представления, инициирующую переход.

Просто добавьте свойство к своим ячейкам, которое содержит Store, принадлежащее этой ячейке, и вам не нужно выполнять какие-либо танцы пути индекса или сравнения представления таблицы.

Вы должны получить что-то простое, например

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    FooCell *cell = (FooCell *)[self.tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER];
    Foo *foo = [self fooForIndexPath:indexPath];

    cell.foo = foo;
    // additional initialization

    return cell;
}

а также

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"view detail"]) {
        DetailViewController *destViewController = segue.destinationViewController;
        destViewController.foo = [(FooCell *)sender foo];
    }
}
person Community    schedule 06.11.2013
comment
Ой. мой. черт возьми Ты просто изменил мою жизнь. Я только что добавил параметр dataID в свой подкласс UITableViewCell (который уже был подклассом для каждой ячейки в моем проекте), и теперь, как вы сказали, мне больше не нужно беспокоиться об этих надоедливых индексных путях или сравнениях табличных представлений! Я действительно хотел бы проголосовать за это более одного раза. Спасибо еще раз! - person Jacob Pritchett; 23.11.2013

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{

если (self.filteredListContent)

{//NSLog(@"опубликовать отфильтрованные данные";}

еще

{//NSLog(@"опубликовать все";}

}

person Tory Hong    schedule 26.04.2012

Вы используете неправильный тест.

if (self.tableView == self.searchDisplayController.searchResultsTableView) {
  ...

Это всегда будет терпеть неудачу, вы спрашиваете, отличаются ли два разных tableView. Ответ всегда нет.

Однако вы можете проверить, является ли отправитель из searchResultsTableView.

NSIndexPath *searchIndexPathOfSelectedCell = [self.searchDisplayController.searchResultsTableView indexPathForCell:sender];

if (searchIndexPathOfSelectedCell) {
  ...
person Steffen Frost    schedule 28.03.2014