2017-09-08 45 views
0

我登录了系统的用户时,提出上述VC根视图控制器的导航控制器用户注册时,我希望他们要经过一个教程,本教程是已经出现在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”。

相当肯定我只是构造此相当差, 预先感谢

+0

你的意思profileSettupVC或TutorialVC? – 3stud1ant3

+0

@ 3stud1ant3对不起,我的意思是TutorialVC。刚刚编辑 –

回答

1

的导航控制器对象管理使用导航堆,这是由视图控制器的阵列表示当前所显示的屏幕

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

所以,你可以创建viewcontrollerarray,并将其分配到的NavigationController

var viewControllers: [UIViewController]

一个viewControllers财产不需要推TutorialVC进入HomeVC

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

1

使用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) 

希望这将有助于

+0

我真的希望这个工作,[FirstVC,SecondVC]似乎是一个伟大的方式来初始化!我得到了这个错误,虽然 '推动导航控制器不支持' –

+0

最后,你想要呈现该视图是否正确? – KavyaKavita

+0

是的,也许我误解了导航控制器的工作原理。我想换成HomeVC的导航控制器,并且已经提供了TutorialVC –

1

我认为要做到这一点的最好办法是使用MainViewController和通知,并做这样的事情:

MainViewController:

//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仍然有效。希望这可以帮助!

相关问题