从popup的UINavigationController或UITabBarController中确定viewWillAppear

我无法find一种方法来区分从Nav控制器堆栈popup,并从UITabBarController进入视图控制器。

我只想在ViewWillAppear中调用一个方法,只有在TabBar中显示视图,而不是在有人按下导航控制器的时候。

如果我没有使用TabBarController,我可以很容易地使用viewDidLoad获得这个function。

我试过了,

override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) println("View Will Appear") if isBeingPresented() { println("BP") } if isMovingFromParentViewController() { println("from") } if isMovingToParentViewController() { println("to") } } 

但是当我按下Tab键或者当按下button时,没有什么区别。

只有“看法会出现”才会被调用。

使用iOS 8.4 / Swift

听起来很像UITabBarControllerDelegate使用。

首先,在你的ViewController的comingFromTab上添加一个Bool属性:

 class MyViewController: UIViewController { var comingFromTab = false // ... } 

将你的UITabBarControllerDelegate设置为你想要的任何类并实现方法shouldSelectViewController 。 您可能还想要UITabBarController的子类,并把它们放在那里。

 func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { if let myViewController = viewController as? MyViewController { myViewController.comingFromTab = true } 

如果你的选项卡的初始视图控制器是一个UINavigationController ,你将不得不解开,并访问它的第一个视图控制器:

 if let navController = viewController as? UINavigationController { if let myViewController = navController.viewControllers[0] as? MyViewController { // do stuff } } 

最后,在视图控制器中添加viewWillAppear所需的任何function:

 override func viewDidAppear(animated: Bool) { super.viewWillAppear(animated) // ... if comingFromTab { // Do whatever you need to do here if coming from the tab selection comingFromTab = false } } 

没有办法知道肯定的。 所以我猜最简单的方法是添加一些variables,在popup回视图控制器并检查它在viewWillAppear中的状态之前,您将不得不更改。

 class YourViewController: UIViewController { var poppingBack = false override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if !poppingBack { // your logic } else { poppingBack = false // reset it for next time } } } // somewhere else in code, suppose yourVC is YourViewController yourVC.poppingBack = true self.navigationController.popToViewController(yourVC, animated: true) 

您也可以尝试实现UINavigationControllerDelegate- navigationController:willShowViewController:animated:方法,并检查从标签栏呈现视图控制器时是否会调用它。

你可以检查parentViewController属性

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) if parentViewController is UITabBarController { // Presented by UITabBarController } else if parentViewController is UINavigationController { // Presented by UINavigationController } else { // Presented by ... } }