SearchDisplayController TableView Segue Проблема

Я пытаюсь поместить searchDisplayController в мой tableviewController. Кажется, это работает очень хорошо, но когда я нажимаю на tableViewCell и пытаюсь перейти к detailViewController, приложение вылетает.

Вылетает, только если я не пытаюсь выполнить поиск. Если я нажимаю на один из отфильтрованных результатов, он просто переходит в подробности к DetailViewController. Любые идеи о том, почему это не может работать? Спасибо!

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath 
*)indexPath {
    [self performSegueWithIdentifier:@"showBusinessDetails" sender:indexPath];
}

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

    if ([[segue identifier] isEqualToString:@"showBusinessDetails"]) {
        ProfileViewController *destination = [segue destinationViewController];
        NSIndexPath * indexPath = (NSIndexPath*)sender;

        if (self.tableView == self.searchDisplayController.searchResultsTableView) {
            destination.title = [[businesses objectAtIndex:indexPath.row] 
            valueForKey:@"name"];
            destination.businessDetails = [businesses objectAtIndex:indexPath.row];
        }
        else {
            destination.title = [[filteredBusinesses objectAtIndex:indexPath.row] 
            valueForKey:@"name"];
            destination.businessDetails = [filteredBusinesses 
            objectAtIndex:indexPath.row];
        }
    }
}

2 ответа

Похоже, у вас обратное выражение if. Если табличным представлением является searchResultsTableView, вы должны получать businessDetails от фильтрованных предприятий (не предприятий), не так ли?

Вы должны задать аналогичный вопрос о том, какой в ​​настоящее время активный просмотр таблицы в вашем UITableViewController метод делегата, tableView:didSelectRowAtIndexPath:,

Как вы уже написали, этот метод делегата может отвечать только на self.tableViewОднако вы также ожидаете, что он ответит на self.searchDisplayController.searchResultsTableView,

Чтобы дать ему возможность ответить на self.searchDisplayController.searchResultsTableView, вы должны включить код, похожий на этот...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        UIViewController *destinationVC = nil;
        SegueList *segueToList = nil;

        NSString *mainStoryboard = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:mainStoryboard bundle:nil];

        if ([self.entity isEqualToString:self.localisedEntityDocument]) {
            destinationVC = [storyboard instantiateViewControllerWithIdentifier:@"id_ViewControllerExample1"]; //insert appropriate "ID"
            segueToList = [[SegueList alloc] initWithIdentifier:@"segueView"
                                                         source:self
                                                    destination:destinationVC];

        } else if ([self.entity isEqualToString:self.localisedEntityTransmittal]) {
            destinationVC = [storyboard instantiateViewControllerWithIdentifier:@"id_ViewControllerExample2"]; //insert appropriate "ID"
            segueToList = [[SegueList alloc] initWithIdentifier:@"segueView"
                                                         source:self
                                                    destination:destinationVC];

        } else {
            //error logging
        }
        UITableViewCell *cellSegue = [tableView cellForRowAtIndexPath:indexPath];
        [self prepareForSegue:segueToList sender:cellSegue];
        [segueToList perform];
    } else {
        //Probably nothing here if you are using a storyboard segues.
    }
}

Обратите внимание, что вам потребуется ввести (или применить) идентификатор контроллера представления к целевому контроллеру представления в вашей раскадровке.

Вам также потребуется написать собственный переход. Я предпочитаю размещать мой в верхней части класса TVC, для которого они требуются, используя код, подобный этому...

#pragma mark - CUSTOM SEGUE
#pragma mark

////////////////////////////////////////////////////////////
/// Subclass of UIStoryboardSegue must override -perform ///
////////////////////////////////////////////////////////////
@interface SegueList : UIStoryboardSegue

@end

@implementation SegueList

- (void)perform {
    DD_TVC_List *sourceViewController = self.sourceViewController;
    [sourceViewController.navigationController pushViewController:self.destinationViewController animated:YES];
}

@end
////////////////////////////////////////////////////////////
///         END of subclass of UIStoryboardSegue         ///
////////////////////////////////////////////////////////////

@interface //normal TVC implementation file

И наконец, включите соответствующий код в свой ТВЦ prepareForSegue метод для ответа на идентификатор segue (в моем примере кода segueView) в вашем методе делегата, tableView:didSelectRowAtIndexPath:,

Другие вопросы по тегам