Раскадровка: изменение корневого представления контроллера UINavigation, указанного в раскадровке - PullRequest
0 голосов
/ 24 марта 2012

Я просмотрел предложенный список и не увидел ничего, что могло бы соответствовать моей дилемме.

Я пишу свой первый проект раскадровки. У меня есть UITabBarController, который управляет 4 вкладками. Каждая вкладка имеет UINavigationController в качестве своего корня и количество представлений в каждой.

Один из стеков навигации на самом деле представляет собой «кольцо» из трех контроллеров представления. Я использую пользовательский переход, чтобы заменить обычное «накопление» стека навигации простой заменой (я использую один вид).

Это прекрасно работает. Раскадровка и пользовательский переход - это то, что доктор прописал.

Тем не менее, я хочу дать пользователю выбор, с какого из 3 представлений он начинает (становится корнем стека навигации). Раскадровка настаивает на том, чтобы я выбрал один из них в качестве корневого. Однако во время выполнения пользователь может захотеть, чтобы начальное представление было другим, поэтому я хочу, чтобы у стека навигации было другое представление.

В приложении, основанном на nib, я просто создаю новый контроллер из nib и заменяю текущий корень этим контроллером.

Как мне выбрать контроллер и сделать это в раскадровке?

1 Ответ

0 голосов
/ 24 марта 2012

ОБНОВЛЕНИЕ: Благодаря комментарию в другой теме я смог немного упростить это.

ОК.Я понял это.

Вместо того, чтобы заменить рут, я просто включаю соответствующий контроллер.Это потому, что изменение корня требует повторного создания контроллера, и лиса просто не стоит погони.Это не имеет никакого эффекта на UX, поэтому мы делаем это следующим образом:

/**************************************************************//**
 \brief Selects the initial search screen, depending on the user's choice.
 *****************************************************************/
- (void)selectInitialSearchAndForce:(BOOL)force         ///< If YES, then the screen will be set to the default, even if we were already set to one.
{
    UITabBarController  *tabController = (UITabBarController *)self.window.rootViewController;

    [tabController setSelectedIndex:0]; // Set the tab bar to the search screens.

    if ( force )
        {
        UIStoryboard    *st = [tabController storyboard];

        [[searchNavController navigationController] popToRootViewControllerAnimated:NO];

        UIViewController    *newSearch = nil;

        switch ( [[BMLT_Prefs getBMLT_Prefs] searchTypePref] )
            {
            case _PREFER_MAP_SEARCH:
            if ([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPad)   // The map and simple searches are combined, on the iPad.
                {
                newSearch = [st instantiateViewControllerWithIdentifier:@"map-search"];
                }
            break;

            case _PREFER_ADVANCED_SEARCH:
            newSearch = [st instantiateViewControllerWithIdentifier:@"advanced-search"];
           break;
            }

        if ( newSearch )    // We push the controller, as opposed to changing the root, because it's easier, and doesn't violate any of our ground rules.
            {
            [[searchNavController navigationController] pushViewController:newSearch animated:NO];
            // In the case of the iPad, we use a standard navbar push, so we need to prime the simple view to properly populate the Advanced view back button.
            if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
                {
                UIViewController    *simpleViewController = [[[searchNavController navigationController] viewControllers] objectAtIndex:0];

                simpleViewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString([[simpleViewController navigationItem] title], nil)
                                                                                                         style:UIBarButtonItemStyleBordered
                                                                                                        target:nil
                                                                                                        action:nil];
                }
            }
        }
}
...