Как создать экземпляр раскадровки с заданным корневым контроллером представления и начальным контроллером представления?

В моем приложении есть раскадровка с контроллером навигации и несколькими представлениями. Это автоматически помещает панель навигации с кнопкой «Назад» в любые представления, которые не являются корневым представлением.

Однако иногда я ухожу от этой раскадровки к отдельному наконечнику. Я хочу вернуться к раскадровке, но не обязательно к исходному корневому представлению. В настоящее время я использую этот метод для этого:

+(void) TransitionOnStoryboard:(NSString*)storyboard to:(NSString*)identifier withViewController:(UIViewController*)viewController
{
    UIStoryboard *sb = [UIStoryboard storyboardWithName:storyboard bundle:nil];
    UIViewController *vc = [sb instantiateViewControllerWithIdentifier:identifier];
    vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [viewController presentViewController:vc animated:YES completion:NULL];
}

Это показывает представление, которое я хочу, но без панели навигации. Как мне указать свой навигационный контроллер или корневой вид, чтобы приложение знало, что нужно поместить панель навигации с кнопкой «Назад»?

Спасибо


person public static void    schedule 19.06.2014    source источник
comment
Привет, для перехода к другому файлу пера либо вы модально представляете этот контроллер пера, либо нажимаете его на тот же контроллер навигации. В любом из этих случаев, если вы просто выскочите (в случае нажатия) или закроете контроллер пера (в случае модального), вы вернетесь к представленному контроллеру. Если это не то, что вам нужно, пожалуйста, дайте больше спецификаций   -  person if-else-switch    schedule 19.06.2014
comment
Почему вы не помещаете свой созданный VC в стек навигации, а не показываете его модальным! вместо этого вы должны были использовать [viewController.navigationController pushViewController:vc animated:YES]   -  person Ayan Sengupta    schedule 19.06.2014
comment
Я не думаю, что это имеет эффект желания   -  person public static void    schedule 19.06.2014


Ответы (2)


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

Представьте наконечник как полноэкранное модальное окно. Это избавит вас от навигационной панели, как хотелось бы. Из этого нового контроллера представления вы можете добавить больше модальных окон, добавить контроллер навигации или что-то еще.

Обратите внимание, что вы можете делать все это и оставаться внутри своей раскадровки.

Когда вы закончите, закройте модальное окно, чтобы открыть свой навигационный контроллер, и вы вернетесь к работе со своей раскадровкой. Вы можете вставить новый контроллер представления в свой навигационный контроллер без анимации, и он должен отображаться как самый передний VC, когда вы выталкиваете модальное окно, полученное из пера.

person Duncan C    schedule 19.06.2014
comment
Привет, спасибо за помощь. Итак, я не хочу избавляться от панели навигации; дело в том, что я не хочу потерять его, когда перезапущу раскадровку. Как запустить/закрыть новые контроллеры представления, чтобы они работали так, как вы сказали? - person public static void; 19.06.2014
comment
либо представьте его как модальное окно, а затем закройте его, когда закончите, либо поместите его в свой стек навигации (при желании скрыв панель навигации), а затем извлеките его из стека, когда закончите. В любом случае стек навигации остается под новым VC, который исходит от пера. - person Duncan C; 19.06.2014

Я уверен, что это не идеальный способ решить эту проблему, но он очень хорошо сработал для меня.

По сути, я удалил все представления из контроллера представления, которые были сгенерированы с тех пор, как я ушел от раскадровки, но до текущего представления и вытащил текущее представление. В данном случае эти представления были одного класса (CheckboxListViewController), поэтому их можно было просто удалить, как показано ниже:

+(void) navigateToMainMenu:(UINavigationController*)navigationController
{
    [QuickView removeFromNavigationController:navigationController allOfViewControllerWithClass:[CheckboxListViewController class]];
    [navigationController popViewControllerAnimated:YES];
}

+(void) removeFromNavigationController:(UINavigationController *)navigationController allOfViewControllerWithClass:(Class)viewControllerClass
{
    NSMutableArray *keptViewControllers = [[NSMutableArray alloc]init];
    for (UIViewController *viewController in navigationController.viewControllers)
        if (![viewController isKindOfClass:viewControllerClass])
            [keptViewControllers addObject:viewController];
    navigationController.viewControllers = keptViewControllers;
}

(примечание: QuickView — это имя класса, содержащего эти методы).

Любые другие классы, к которым вы не хотите возвращать всплывающее окно, можно удалить, вызвав:

[QuickView removeFromNavigationController:navigationController allOfViewControllerWithClass:[YourClassName class]];

В методе navigationToMenu.

person public static void    schedule 19.06.2014
comment
Вы правы, это не идеальное решение, поскольку оно зависит от того, является ли UIViewController заданным типом. Решение Дункана — правильный подход. Честно говоря, вам просто нужно поддерживать количество viewControllers, добавленных в стек навигации и popViewControllerAnimated: соответствующее количество раз. Гораздо проще, чем пытаться поддерживать свой собственный стек навигации. - person MDB983; 19.06.2014