Могу ли я попасть в конкретный ViewController? - PullRequest
47 голосов
/ 12 июня 2010

Я использую приложение на основе навигации. Я помещаю Первый ViewController во Второй ViewController и из Второго ViewController в Третий ViewController. Теперь я хочу перейти от третьего ViewController к первому ViewController. Я выполняю эту задачу, используя приведенный ниже код, но мое приложение упало.

Пожалуйста, дайте мне какое-нибудь тело. Я не могу использовать pop для rootViewController, потому что это другой viewController. Заранее спасибо ...

В третьем контроллере вида я написал это:

FirstViewCtr *x=[[FirstViewCtr alloc] initWithNibName:@"FirstViewCtr" bundle:nil];
[self.navigationController popToViewController:x animated:NO];

Ответы [ 15 ]

1 голос
/ 17 июля 2017

Реализовано и протестировано в Swift 3.0

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

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)
1 голос
/ 08 мая 2017

После долгих усилий кто-то создал быстрое расширение back для определенного контроллера представления в 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)
1 голос
/ 12 июня 2010

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

Если вы возвращаетесь к контроллеру корневого представления, вы можете использовать popToRootViewControllerAnimated:

Если вы возвращаетесь на известное расстояние, вы можете звонить popViewControllerAnimated: более одного раза. В вашем примере это было бы 2 контроллера, так что для вызовов. Вы можете сделать то же самое, посмотрев в viewControllers на контроллер 2 с конца и подключившись к нему.

Приведенные выше предложения являются быстрыми исправлениями. Один из оптимальных сценариев - передача контроллера, к которому вы хотите вернуться, каждому последующему нажатому контроллеру. Первый передает себя второму, второй передает эту ссылку третьему, третий всплывает переданной ссылке, которая является первой.

Фактически вы создаете временный корневой контроллер. Вы можете создать подкласс UINavigationController и добавить свойство temporaryRoot и метод popToTemporaryRootViewControllerAnimated:, которые будут открывать ваш временный корень и очищать его. Когда первый выводит секунды, он также устанавливает себя в качестве временного корня, так что каждый контроллер в стеке не должен передавать ссылку. Вам нужно было бы добавить несколько дополнительных проверок, чтобы не допустить, чтобы вы никогда не пробежали мимо временного корня, не очистив его.

0 голосов
/ 15 мая 2018

Поместите функцию в 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)
0 голосов
/ 09 марта 2018
for controller in self.navigationController!.viewControllers as Array {
        if controller.isKind(of: LoginVC.self) {
            _ =  self.navigationController!.popToViewController(controller, animated: true)
            break
        }
    }
...