0

Я пытаюсь поместить searchDisplayController в свой tableviewController. Это работает очень хорошо, но когда я нажимаю на tableViewCell и пытаюсь перейти к detailViewController, приложение аварийно завершает работу.SearchDisplayController TableView Segue Issue

Это только сбой, если я не пытаюсь выполнить поиск. Если я нажму на один из отфильтрованных результатов, он просто меня перечислит в 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]; 
     } 
    } 
} 
+0

Вы добавляете 'UISearchDisplayController' программно или используя раскадровку? – andrewbuilder

ответ

0

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

+0

Спасибо, вы правы, но на самом деле кажется, что мой код не различает, есть ли в строке поиска контент. Оператор if возвращает false каждый раз. – Brandon

0

Вы должны задать аналогичный вопрос, который является активным в настоящее время табличным представлением в вашем делете 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. 
    } 
} 

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

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

#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:.