从弹出的 UINavigationController 或 UITabBarController 确定 viewWillAppear

Dog*_*fee 5 uitabbarcontroller uinavigationcontroller viewwillappear ios swift

我无法找到一种方法来区分从导航控制器堆栈弹出和从 UITabBarController 进入视图控制器。

我只想在视图从 TabBar 呈现时调用 ViewWillAppear 中的方法,而不是在有人按下导航控制器时。

如果我没有使用 TabBarController,我可以很容易地使用 viewDidLoad 在功能上获得它。

我试过了,

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    println("View Will Appear")

    if isBeingPresented() {
        println("BP")
    }
    if isMovingFromParentViewController() {
        println("from")
    }
    if isMovingToParentViewController() {
        println("to")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我按下 Tab 按钮或按下后退按钮时没有区别。

只有“视图将出现”被调用。

使用 iOS 8.4 / Swift

小智 5

没有办法确定。所以我想最简单的方法是添加一些变量,在弹出回视图控制器并检查 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)
Run Code Online (Sandbox Code Playgroud)

您还可以尝试实现UINavigationControllerDelegate- navigationController:willShowViewController:animated:方法并检查在从选项卡栏显示视图控制器时是否会调用它。


JAL*_*JAL 4

听起来很好用UITabBarControllerDelegate

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

class MyViewController: UIViewController {
    var comingFromTab = false
    
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果您的选项卡的初始视图控制器是 a UINavigationController,您将必须解开它并访问它的第一个视图控制器:

if let navController = viewController as? UINavigationController {
    if let myViewController = navController.viewControllers[0] as? MyViewController {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

viewWillAppear最后,在视图控制器中添加您需要的任何功能:

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