Подтвердить что ты не робот

Могу ли я появиться в 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];
4b9b3361

Ответ 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)