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