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:
,