Написав первую строку, вы получите индексы всех контроллеров представления, а со второй строки вы достигнете своего пункта назначения.
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];
у меня есть ответ здесь. Это - 100%, работающих код на Swift> 4. X
, Как я могу вытолкать определенный Контроллер Представления в Swift
Ваш код создает новый экземпляр представления, которое никогда не помещалось в стек, а затем пытается вернуться к этому контроллеру.
Если вы возвращаетесь к корневому контроллеру представления, вы можете использовать popToRootViewControllerAnimated:
Если вы возвращаетесь на известное расстояние, вы можете вызвать popViewControllerAnimated:
более одного раза. В вашем примере это будет 2 контроллера для вызовов. Вы можете сделать то же самое, посмотрев в viewControllers
контроллер 2 с конца и перейдя к нему.
Приведенные выше предложения представляют собой быстрые исправления. Один из лучших практических сценариев - передать контроллер, к которому вы хотите вернуться, каждому последующему контроллеру, который вы нажимаете. Первый передает себя второму, второй передает эту ссылку третьему, третье попадает в переданную ссылку, которая является первой.
По сути, вы создаете временный корневой контроллер. Вы можете создать подкласс UINavigationController
и добавить свойство poraryRoot
и метод popToTemporaryRootViewControllerAnimated:
, который появится во временном корне и очистит его. При первом нажатии секунд он также устанавливает себя в качестве временного корня, так что каждому контроллеру в стеке не нужно передавать ссылку. Вам придется добавить несколько дополнительных проверок, чтобы не быть уверенным, что вы никогда не пройдете мимо временного рута, не очистив его.