【问题标题】:How to check after popping a ViewController, the ViewController on top of the stack, is a particular one?弹出 ViewController 后如何检查堆栈顶部的 ViewController 是否是特定的?
【发布时间】:2019-09-30 05:45:16
【问题描述】:

假设我目前在 BaseViewController 。我可以从其他 2 个视图控制器(比如 A 和 B)接近这个视图控制器类。所以当我弹出 BaseViewController 时,我如何检查堆栈顶部是否存在 A 或 B?下面是我的代码(在BaseViewController 内):

func goToAOrBViewController {
   // If after popping viewController is A do this
   navigationController.popViewController(animated: true)
   // Id after popping viewController is B do this
   // Instantiate B and push it
}

【问题讨论】:

    标签: swift uiviewcontroller uinavigationcontroller


    【解决方案1】:

    有很多方法可以做到这一点

    第一个也是最简单的方法

        func visibleViewController() -> UIViewController? {
            let appDelegate = UIApplication.shared.delegate
            if let window = appDelegate!.window {
                return window?.visibleViewController
            }
            return nil
        }
    
        func goToAOrBViewController {
           // If after popping viewController is A do this
           navigationController.popViewController(animated: true)
           if visibleViewController() == viewControllerA{
               //Do stuff for A
           }else{
               //Do stuff for B
           }
        }
    

    第二种显而易见的方法

        let topController = UIApplication.sharedApplication().keyWindow?.rootViewController
        if topController == viewControllerA {
            //Do stuff for A
        }else{
            //Do stuff for B
        }
    

    【讨论】:

      【解决方案2】:

      您可以同时弹出和推送视图控制器。

      未测试:

      navigationController?.viewControllers.removeLast()
      let topVC = navigationController?.viewControllers.last
      
      if topVC == A {
        navigationController?.viewControllers.append(A)
        navigationController?.setViewControllers(A, animated: false)
      } else {
        navigationController?.viewControllers.append(B)
        navigationController?.setViewControllers(B, animated: false)
      }
      

      【讨论】:

        【解决方案3】:

        BaseViewController类里面:

        func goToAOrBViewController() {
           guard let navigationController = self.navigationController else { return }
           navigationController.popViewController(animated: false)
           guard let viewController = navigationController.topViewController else { return }
           if viewController is ViewControllerA {
              // Do something for A
           } else if viewController is ViewControllerB {
              // Do Something for B
           }
           // You need not put else-if case if you are sure BaseVC is reachable from A and B only (just use else)
        }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-09
          • 2012-12-31
          • 2012-01-04
          • 2018-04-12
          • 1970-01-01
          • 2018-11-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多