iPad splitViewController Рекурсивная детализация — доступ к DetailViewController

#ios #ipad #uisplitviewcontroller

#iOS #iPad #uisplitviewcontroller

Вопрос:

Я взял проект, основанный на стандартном шаблоне iPad SplitViewerController, и реализовал рекурсивную детализацию навигации на любое количество уровней следующим образом:

Сначала я создал новый контроллер представления (с именем NavItemController), который я помещаю в стек контроллера в методе didSelectRowAtIndexPath RootViewController следующим образом:

 NavItemController  *navItemController = [[NavItemController alloc] initWithNibName:@"NavItemController" bundle:[NSBundle mainBundle]];
navItemController.title = catalogue.name;
[[self navigationController] pushViewController:navItemController animated:YES];
 

Затем я использую этот контроллер представления для всей навигации вверх и вниз по моей древовидной структуре (поэтому RootViewController теперь используется только для отображения начального корневого уровня навигации, т.Е. Элементов без родительских элементов).

Все это работает хорошо.

Теперь я пытаюсь обновить метку в детальном представлении (detailViewDescriptionLabel) при выборе элемента в NavItemController. Для этого я сначала добавил выход в свой NavItemController:

 @property (nonatomic, strong) IBOutlet DetailViewController *detailViewController;
 

и настроил его в InterfaceBuilder, добавив контроллер представления из библиотеки в список объектов, изменив его класс на DetailViewController и подключив выход, который я нашел под владельцем файла.

На данный момент, если я пройдусь по своему коду, я обнаружу, что он правильно устанавливает элемент detailItem в моем представлении detail для объекта, выбранного в моем NavController, и, похоже, он правильно устанавливает значение detailDescriptionLabel.text в значение из этого элемента detailItem. Однако это не отражается в пользовательском интерфейсе (он все еще работает, если я делаю это из RootViewController).

Я предполагаю, что я что-то неправильно подключил или где-то пропустил шаг — я (очевидно) довольно новичок в iOS — любые указатели будут оценены.

Ответ №1:

В итоге я решил свою проблему, создав свой проект с нуля, используя iOS 5 и шаблон Master Detail. Я также решил использовать функцию раскадровки.

Я смог использовать MasterViewController (такой же, как RootViewController в более раннем шаблоне) для моей рекурсивной навигации, т.Е. Мне не нужно было создавать отдельный контроллер представления.

Код в методе MasterViewController didSelectRowAtIndexPath оказался:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    self.detailViewController.detailItem = selectedObject; 

    NavItem *navItem = ((NavItem *) selectedObject);
    Catalogue *catalogue = nil;
    Document *document = nil;

    if (navItem.catalogue != nil) // Load child catalogues and documents
    {
        catalogue = [navItem catalogue];
        DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
        [dataLoader drillDownIntoNavItems:catalogue];
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
        MasterViewController  *controller = [storyBoard instantiateViewControllerWithIdentifier:@"master"];
        controller.managedObjectContext = self.managedObjectContext;
        controller.title = catalogue.name;

        [[self navigationController] pushViewController:controller animated:YES];
    } 
    else if (navItem.document != nil) // Load attachments
    {
        document = [navItem document];
        DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
        [dataLoader drillDownIntoNavItems:document];
        UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
        MasterViewController  *controller = [storyBoard instantiateViewControllerWithIdentifier:@"master"];
        controller.managedObjectContext = self.managedObjectContext;
        controller.title = document.name;
        [[self navigationController] pushViewController:controller animated:YES];

        // Display document in detail viewer
    }

    else // attachment
    {
        // Display attachment in popover
    }
}
 

Также важен метод viewWillDisappear в MasterViewController:

 - (void)viewWillDisappear:(BOOL)animated
{
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
        // back button was pressed. We know this is true because self is no longer
        // in the navigation stack. 
        DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
        [dataLoader drillUpIntoNavItems];
    }

    [super viewWillDisappear:animated];
}