Могу ли я появиться в Specific ViewController?
Я использую приложение на основе навигации. Я помещаю Первый ViewController во Второй ViewController и из Второго ViewController в Третий ViewController. Теперь я хочу перейти из третьего ViewController в First ViewController. Я выполняю эту задачу, используя приведенный ниже код, но мое приложение упало.
Пожалуйста, любое тело, дайте мне правильные указания. Я не могу использовать pop to rootViewController, потому что это другой viewController. Заранее спасибо...
В третьем ViewControler я написал это:
FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];
Ответы
Ответ 1
Написав первую строку, вы получите Индексы всех контроллеров просмотра и со второй строки. Вы достигнете своего места назначения.
NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:YES];
Ответ 2
Более безопасный подход:
- (void)turnBackToAnOldViewController{
for (UIViewController *controller in self.navigationController.viewControllers) {
//Do not forget to import AnOldViewController.h
if ([controller isKindOfClass:[AnOldViewController class]]) {
[self.navigationController popToViewController:controller
animated:YES];
return;
}
}
}
Ответ 3
Своевременный способ:
let dashboardVC = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
navigationController!.popToViewController(dashboardVC, animated: true)
Ответ 4
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
Ответ 5
Часто важно сделать это сверху стека, поэтому:
- (void)popToLast:(Class)aClass
{
for (int i=self.navigationController.viewControllers.count-1; i>=0; i--)
{
UIViewController *vc = self.navigationController.viewControllers[i];
if ([vc isKindOfClass:aClass])
{
[self.navigationController popToViewController:vc animated:YES];
break;
}
}
}
и вы называете это
popToLast:[SomeViewController class];
Ответ 6
- (void) RetunToSpecificViewController{
for (UIViewController *controller in self.navigationController.viewControllers)
{
if ([controller isKindOfClass:[AnOldViewController class]])
{
//Do not forget to import AnOldViewController.h
[self.navigationController popToViewController:controller
animated:YES];
break;
}
}
}
Ответ 7
Быстрая и безопасная версия Swift 3:
if let vc = navigationController.viewControllers.filter({ $0 is SpecificViewControllerClass }).first {
navigationController.popToViewController(vc, animated: true)
}
Ответ 8
Ваш код создает новый экземпляр представления, которое никогда не было нажато в стек, затем пытается вернуться к этому контроллеру.
Если вы вернетесь к контроллеру корневого представления, вы можете использовать popToRootViewControllerAnimated:
Если вы выбрали известное расстояние, вы можете вызывать popViewControllerAnimated:
более одного раза. В вашем примере это будет 2 контроллера, поэтому для вызовов. Вы можете сделать то же самое, посмотрев viewControllers
для контроллера 2 с конца и поплыв к нему.
Вышеуказанные предложения являются быстрыми исправлениями. Одним из наиболее эффективных сценариев будет переход контроллера, который вы хотите вернуть, на каждый последующий контроллер, который вы нажимаете. Сначала он переходит ко второму, а второй передает ссылку на третью, третью посылку на пройденную ссылку, которая является первой.
По сути, вы создаете временный корневой контроллер. Вы можете подклассифицировать UINavigationController
и добавить свойство temporaryRoot
и метод popToTemporaryRootViewControllerAnimated:
, который будет появляться на вашем временном корне и очистить его. При первом нажатии секунд он также устанавливает себя как временный корень, так что каждый контроллер в стеке не должен передавать ссылку вокруг. Вам нужно будет добавить дополнительные проверки, чтобы не допустить, чтобы вы никогда не пропустили временную загрузку, не очистив ее.
Ответ 9
После многих усилий кто-то создал быстрое расширение назад к определенному контроллеру представления в Swift 3.0.
extension UINavigationController {
func backToViewController(viewController: Swift.AnyClass) {
for element in viewControllers as Array {
if element.isKind(of: viewController) {
self.popToViewController(element, animated: true)
break
}
}
}
}
Вызов метода:
self.navigationController?.backToViewController(viewController: YourViewController.self)
Ответ 10
Реализовано и протестировано в Swift 3.0
Ниже приведен метод, который может быть полезен для перехода к любому конкретному контроллеру View:
func poptoSpecificVC(viewController : Swift.AnyClass){
let viewControllers: [UIViewController] = self.navigationController!.viewControllers
for aViewController in viewControllers {
if aViewController.isKind(of: viewController) {
self.navigationController!.popToViewController(aViewController, animated: true)
break;
}
}
}
Использование:
self.poptoSpecificVC(viewController: createIntervalVC.self)
Ответ 11
Я думаю, что .filter({...}).first
немного медленнее, чем .first(where: {...})
.
Также это может быть написано более точно, чтобы адресовать только UIViewControllers.
extension UINavigationController {
func popToController<T: UIViewController>(_ type: T.Type, animated: Bool) {
if let vc = viewControllers.first(where: { $0 is T }) {
popToViewController(vc, animated: animated)
}
}
func popToControllerOrToRootControllerIfNotInTheStack<T: UIViewController>(_ type: T.Type, animated: Bool) {
if let vc = viewControllers.first(where: { $0 is T }) {
popToViewController(vc, animated: animated)
} else {
popToRootViewController(animated: animated)
}
}
}
Ответ 12
Обновлен для Swift 3:
используется ниже простого кода, для pop для определенного контроллера представления;
for vc in self.navigationController!.viewControllers as Array {
if vc.isKind(of: YourViewControllerName) {
self.navigationController!.popToViewController(vc, animated: true)
break
}
}
Ответ 13
Swift 4 версия
if let viewController = navigationController?.viewControllers.first(where: {$0 is YourViewController}) {
navigationController?.popToViewController(viewController, animated: false)
}
Вы можете указать другой фильтр в .viewControllers.first
в соответствии с вашими потребностями, например, скажем, если у вас есть тот же kind
контроллеров представления, находящихся в навигационном контроллере, то вы можете указать дополнительную проверку, как показано ниже
if let viewController = navigationController?.viewControllers.first(where: {
if let current = $0 as? YourViewController {
return current.someProperty == "SOME VALUE"
}
return false } ) {
navigationController?.popToViewController(viewController, animated: false)
}
Ответ 14
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: LoginVC.self) {
_ = self.navigationController!.popToViewController(controller, animated: true)
break
}
}
Ответ 15
Поместите функцию в UIViewController
1. он проверяет, существует ли Конкретный UIViewController
в UINavigationController
, затем popToViewController
или еще pushViewController
func navigate(_ navVC: AnyClass, pushVC: UIViewController) {
for obj in self.navigationController!.viewControllers {
if obj.isMember(of: navVC) {
self.navigationController!.popToViewController(obj, animated: true)
return
}
}
self.navigationController!.pushViewController(pushVC, animated: true)
}
Использование
self.navigate(ViewController.self, pushVC: self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController)
Ответ 16
у меня есть ответ здесь. Это 100% рабочий код для Swift> 4.X
Как я могу вставить конкретный View Controller в Swift