【问题标题】:How to present a view controller above root vc in navigation controller from another navigation controller如何从另一个导航控制器在导航控制器中的根 vc 之上呈现视图控制器
【发布时间】:2018-02-16 21:12:24
【问题描述】:

我正在为一个用户注册一个系统,当他们注册时我希望他们完成一个教程,这个教程已经在 HomeVC 中以几种不同的方式呈现。我不想创建教程的克隆并将其粘贴到注册过程中,我觉得这是简单的出路.. 寻找最佳实践:)

所以注册后我就是这样做的

 //0. Currently in "Signup" Nav stack
 //1. init VCs for new nav stack
 //2. push tutorial onto HomeVC nav w/o animation
 //3. present stack with HomeVC below Tutorial, but tutorial is what animates in since in on top?


//@1. 
let HomeVC = UIStoryboard(name: "Home", bundle: nil).instantiateViewController(withIdentifier: "HomeViewNavigationController")
let TutorialVC = UIStoryboard(name: "Tutorial", bundle: nil).instantiateViewController(withIdentifier: "TutorialViewController")

//@2.
HomeVC.navigationController?.pushViewController(TutorialVC, animated: false);

//@ 3.
self.present(HomeVC, animated: true)

问题是“HomeVC”会先闪烁,然后会动画“TutorialVC”。

可以肯定的是,我的结构很糟糕, 提前致谢

【问题讨论】:

  • 你的意思是profileSettupVC还是TutorialVC?
  • @3stud1ant3 抱歉,我指的是 TutorialVC。刚刚编辑

标签: ios swift swift3 uiviewcontroller uinavigationcontroller


【解决方案1】:

导航控制器对象使用导航堆栈管理当前显示的屏幕,导航堆栈由视图控制器数组表示

数组中的最后一个视图控制器是当前显示的视图控制器。

因此,您可以创建viewcontrollerarray 并将其分配给NavigationControllerviewControllers 属性

var viewControllers: [UIViewController]

您无需将TutorialVC 推入HomeVC

欲了解更多信息https://developer.apple.com/documentation/uikit/uinavigationcontroller

【讨论】:

    【解决方案2】:

    使用 navigationController 的 viewControllers 属性来创建你想要的堆栈。 使用下面的代码

    let HomeVC = UIStoryboard(name: "Home", bundle: nil).instantiateViewController(withIdentifier: "HomeViewNavigationController")
    let TutorialVC = UIStoryboard(name: "Tutorial", bundle: nil).instantiateViewController(withIdentifier: "TutorialViewController")
    //@2.
    let navigationController = UINavigationController(rootViewController: HomeVC);
    
    //@3.
    navigationController.viewControllers = [HomeVC,TutorialVC]
    
    //@ 4.
    self.present(navigationController, animated: true)
    

    希望这会有所帮助

    【讨论】:

    • 我真的很想让这个工作,[FirstVC,SecondVC] 似乎是一个很好的初始化方式!虽然“不支持推送导航控制器”但我收到此错误
    • 是的,也许我误解了导航控制器的工作原理。我想换成 HomeVC 的导航控制器,已经提供了 TutorialVC
    【解决方案3】:

    我认为最好的方法是使用 MainViewController 和 Notifications 并执行以下操作:

    主视图控制器:

    //init VCs
    override func viewDidLoad() {
        super.viewDidLoad()
        self.initTutorialViewController()
        self.initSignupViewController()
        self.initHomeViewController()
    
        //check if for sign up
        if isForSignUp {
          self.addChildViewController(self.signupViewController!)
          self.view.addSubview((self.signupViewController?.view)!)
        } else {
          self.addChildViewController(self.homeViewController!)
          self.view.addSubview((self.homeViewController?.view)!)
        }
        //other codes here
    }
    

    那么你的 MainViewController 中也应该有这些辅助函数:

    func transition(fromViewController:UIViewController, toViewController:UIViewController) {
        fromViewController.willMove(toParentViewController: nil)
        self.addChildViewController(toViewController)
    
        self.transition(from: fromViewController, to: toViewController, duration: 0.25, options: UIViewAnimationOptions.transitionCrossDissolve, animations: {() -> (Void) in
        }, completion: {(success) -> (Void) in
            fromViewController.removeFromParentViewController()
            toViewController.didMove(toParentViewController: self)
        })
    }
    
    //notification for signing up
    func didSignup(notification:Notification) {
      self.transition(fromViewController: self.signUpViewController!, 
      toViewController: self.tutorialViewController!)
    }
    
    func didFinishTutorial(notification: Notification) {
      self.transition(fromViewController: self.tutorialViewController!, 
      toViewController: self.homeViewController!)
    }
    
    //if you don't need tutorial to be transitioned to
    //add other handlers here.
    

    就是这样,我不确定这是否是最佳实践,但如果我需要转到 LoginPage 或直接到 HomeVC(如果 sessionToken 仍然处于活动状态),这也是我处理转换的方式。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2013-03-12
      • 1970-01-01
      • 2014-10-10
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多