从弹出的 UINavigationController 或 UITabBarController 确定 viewWillAppear

Determine viewWillAppear from Popped UINavigationController or UITabBarController

我无法找到区分从导航控制器堆栈弹出和从 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")
    }
}

但是当我按下 Tab 按钮或按下返回按钮时没有区别。

只有 "View Will Appear" 被调用。

使用 iOS 8.4 / Swift

无法确定。所以我想最简单的方法是添加一些你必须更改的变量,然后再返回到该视图控制器并检查它在 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 ...
    }
}

听起来 UITabBarControllerDelegate.

很好用

首先,在您的 ViewController comingFromTab 上添加 Bool 属性:

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

UITabBarControllerDelegate 设置为您想要的 class 并实施方法 shouldSelectViewController。您可能还想子 class 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 中添加您需要的任何功能:

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