从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 ... } }