Как перевести обратно в уже загруженный UIViewController?

У меня есть представление о раскадровке, у которой есть кнопка для выполнения определенного действия. Однако для выполнения этого действия пользователь должен войти в систему. Обработчик кнопки проверяет, зарегистрирован ли пользователь и выполняет один сеанс, если "ДА", а другой - "НЕТ". NO segues подталкивает контроллер входа в систему. Существует еще один переход к первому контроллеру представления, поэтому, если логин будет успешным, пользователь может забрать, где они остановились. Контроллеры представлений встроены в контроллер навигации.

Проблема в том, что 'return' segue загружает весь новый экземпляр контроллера вида и не ссылается на исходный экземпляр, поэтому я заканчиваю пустым интерфейсом и 2 копиями этого контроллера представления в памяти.

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

Ответ 1

Предполагая, что вы используете "push", вы имеете в виду, что используете UINavigationController, тогда вы можете использовать следующее, чтобы вернуться в начало стека.

[self.navigationController popToRootViewControllerAnimated:YES];

или

UIViewController *prevVC = [self.navigationController.viewControllers objectAtIndex:<n>];
[self.navigationController popToViewController:prevVC animated:YES];

чтобы перейти к определенному уровню, где <n> - уровень.

или

[self.navigationController popViewControllerAnimated:YES];

Если вы просто хотите поместить один уровень обратно в стек навигации.

Ответ 2

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

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

 [self dismissViewControllerAnimated:YES completion:nil];

На раскадровке вы щелкните правой кнопкой мыши на кнопке и перетащите касание внутри отправленного события первому ответчику на сцену контроллера вида. Это выполнит обратный переход, который был выполнен, когда вы выполнили переход segue. Вы можете использовать modal segue для этого, не нужно использовать контроллер навигации.

Если вы переместили вид входа в контроллер навигации, вы должны вытащить его из стека (если вернуться к предыдущему виду). Используйте один из следующих вариантов:

    [[self navigationController] popViewControllerAnimated:YES];  // goes back to previous view
[[self navigationController] popToViewController: myViewControllerAfterLogin animated:YES]; // goes back to specific view on stack. 
[[self navigationController] popToRootViewControllerAnimated:YES]; // goes back to first view on the stack

Анимированный переход должен отменять тип перехода, используемый в segue, поэтому зависание будет свернуто, когда вы отклоните представление.

Ответ 4

malhal прав - стоит щелкнуть по его ссылке.

Код, похоже, немного переместился с примера Apple и еще более гибкий. У меня три сцены, но только один пользовательский файл ViewController.m. Мне не нужен стек навигации. Доступ к последующим эпизодам осуществляется с помощью кнопок. Я добавил эту строку в файл .m файла базового представления:

- (IBAction)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC{}

Затем в третьей сцене, которую я управляю, перетаскивается из кнопки на значок выхода и выбирается действие разматывания. Теперь он возвращается с сцены 3 обратно на сцену 2 без необходимости вызова метода rejectViewController.