Apple представляет на своих сайтах разработки для iOS пример того, как использовать разделенное представление с различными подробными видами ( см. Пример MultipleDetailViews ).Во время RootViewController каждый раз, когда ячейка выделяется, инициализируется новый DetailViewController:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
/*
Create and configure a new detail view controller appropriate for the selection.
*/
NSUInteger row = indexPath.row;
UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
if (row == 0) {
FirstDetailViewController *newDetailViewController = [[FirstDetailViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil];
detailViewController = newDetailViewController;
}
if (row == 1) {
SecondDetailViewController *newDetailViewController = [[SecondDetailViewController alloc] initWithNibName:@"SecondDetailView" bundle:nil];
detailViewController = newDetailViewController;
}
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];
// Dismiss the popover if it's present.
if (popoverController != nil) {
[popoverController dismissPopoverAnimated:YES];
}
// Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created).
if (rootPopoverButtonItem != nil) {
[detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
}
[detailViewController release];
}
Теперь моя идея вместо того, чтобы каждый раз инициализировать viewcontrollers, просто инициализировать контроллеры в viewDidLoad (а также в заголовке) и передатьссылки на них при выделении ячейки:
часть viewDidLoad в rootviewcontroller:
firstDetailViewController = [[FirstDetailViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil];
secondDetailViewController = [[FirstDetailViewController alloc] initWithNibName:@"FirstDetailView" bundle:nil];
Теперь метод табличного представления didselectrow выглядит следующим образом:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
/*
Create and configure a new detail view controller appropriate for the selection.
*/
NSUInteger row = indexPath.row;
UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
if (row == 0) {
detailViewController = firstDetailViewController;
}
if (row == 1) {
detailViewController = secondDetailViewController;
}
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];
// Dismiss the popover if it's present.
if (popoverController != nil) {
[popoverController dismissPopoverAnimated:YES];
}
// Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created).
if (rootPopoverButtonItem != nil) {
[detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
}
//[detailViewController release];
}
В ландшафтном режиме все работает нормально, но когда в портретном режиме выдается ошибка, при переключении с первого контроллера детального просмотра на второй, затем на первый и затем хотите переключиться на второй.Появляется следующее сообщение: Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Невозможно представить всплывающие окна из представления, у которого нет окна».
Со вчерашнего вечера я пытаюсь выяснить это, ноя не нахожу решения.У кого-нибудь есть идея?
Приветствия, Доминик