iPad SplitViewController Рекурсивная детализация - Access DetailViewController - PullRequest
0 голосов
/ 01 ноября 2011

Я взял проект, основанный на стандартном шаблоне 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 в моем подробном представлении для объекта, выбранного в моем NavController - и, кажется, правильно устанавливает detailDescriptionLabelЗначение .text для значения из этого detailItem.Однако это не отражается в пользовательском интерфейсе (он все еще работает, если я делаю это из RootViewController).

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

1 Ответ

0 голосов
/ 08 ноября 2011

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