Добавление viewcontrollers в navcontroller с раскадровкой

У меня есть базовая настройка раскадровки, где я загружаю свой NavViewController, который затем указывает на начальный контроллер представления. Затем у меня есть несколько дополнительных контроллеров представления, все из которых последовательно соединяются последовательно через сегменты. Когда я первоначально запускаю свое приложение, я запускаю следующее в моем NavControllerViewController.m

(void)viewDidLoad
{
    [super viewDidLoad];
    NSArray * controllerArray = [self viewControllers];
    NSLog(@"view controllers: %@", controllerArray);
} 

В журнале отображается только самый первый корневой контроллер вида (тот, который непосредственно "подключен" к контроллеру nav). Контроллеры всех видов отсутствуют в стеке. У меня сложилось впечатление, что если бы на моей раскадровке был контроллер представления, то он автоматически был бы добавлен к контроллеру навигации?

Если это не правильно, будет ли хорошей альтернативой создание каждого VC из вызывающего VC? Например, если бы я хотел перейти с VC1 на VC2, я бы поместил следующий код в VC1:

UIViewController *vc2 = [self.storyboard instantiateViewControllerWithIdentifier:@"vc2"];
[self pushViewController:vc2 animated:YES];

Или возможно:

    [self performSegueWithIdentifier:@"vc2Segue" sender:self];

3 ответа

Решение

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

Вы можете использовать тактику самостоятельного выполнения, или контроллер push-представления, или, альтернативно, если это происходит в ответ на нажатие одной кнопки, просто управляйте перетаскиванием с этой кнопки на следующий контроллер представления, и XCode выполняет всю остальную работу для тебя.

Если я правильно понимаю ваш вопрос, у вас есть настройка раскадровки, похожая на приведенный ниже снимок экрана. Когда приложение загружает эту раскадровку, у него определенно будет только один контроллер представления в стеке контроллера навигации, и это будет контроллер корневого представления. main.storyboard

Так как other view controllers are still not pushed into the navigation controller stack,

в Viewcontroller-1Вы могли видеть кнопку some ActionЯ создал push segue от этой кнопки до Viewcontroller-2. После того, как вы нажмете эту кнопку, контроллер второго вида будет перемещен в стек контроллера навигации.

Если вы распечатаете viewcontrollers посчитайте сейчас, вы должны получить счет как 2,

Повторите то же самое в View Controller-2, теперь вы можете увидеть счетчики 3, Потому что теперь у нас есть три контроллера представления, помещенных в стек контроллера навигации.

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

Как заявил АдамГ, UIViewControllers не будут помещены в стек, пока вы не перейдете к ним.

Чтобы установить переход, выберите UIViewController и управление + перетащите соединение к цели UIViewController, На вкладке "Инспектор атрибутов" установите идентификатор последовательности раскадровки.

Перейти к UIViewController использовать метод performSegueWithIdentifier:, До performSegueWithIdentifier: называется prepareForSegue:sender: будет называться. Здесь вы можете передать любые значения, которые следующие UIViewController необходимо. Чтобы проверить, какой вызов вызывается, используйте segue.identifier недвижимость в prepareForSegue:sender:, После этого вы можете получить доступ к destinationViewController имущество.

Если вам нужно вручную создать экземпляр UIViewController использование instantiateViewControllerWithIdentifer:, Идентификатор может быть установлен на вкладке Identity Inspector в раскадровке.

Другие вопросы по тегам