Ios 确定视图将从弹出的UINavigationController或UITabBarController中显示
我无法找到区分从导航控制器堆栈弹出和从UITabBarController进入视图控制器的方法 我想调用ViewWill中的方法,它仅在从选项卡栏显示视图时出现,而不是在有人按下导航控制器时出现 如果我没有使用TabBarController,我可以很容易地使用viewDidLoad在功能上实现这一点 我试过了Ios 确定视图将从弹出的UINavigationController或UITabBarController中显示,ios,swift,uinavigationcontroller,uitabbarcontroller,viewwillappear,Ios,Swift,Uinavigationcontroller,Uitabbarcontroller,Viewwillappear,我无法找到区分从导航控制器堆栈弹出和从UITabBarController进入视图控制器的方法 我想调用ViewWill中的方法,它仅在从选项卡栏显示视图时出现,而不是在有人按下导航控制器时出现 如果我没有使用TabBarController,我可以很容易地使用viewDidLoad在功能上实现这一点 我试过了 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) printl
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按钮或按下back按钮时,显示没有区别
只有“视图将显示”被调用
使用iOS 8.4/Swift无法确定。所以我想最简单的方法是添加一些变量,在弹出到视图控制器并检查其在ViewWillDisplay中的状态之前,您必须更改这些变量
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 ...
}
}
听起来这是一个很好的用法 首先,在ViewController上添加一个
Bool
属性comingFromTab
:
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
}
}
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
}
}
最后,添加视图中所需的任何功能将出现在视图控制器中:
if let navController = viewController as? UINavigationController {
if let myViewController = navController.viewControllers[0] as? MyViewController {
// do stuff
}
}
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
}
}
您是否尝试添加一些观察者并使用NSNotificationCenter?没有想到-将有一个想法您的ViewController堆栈看起来如何?您的视图控制器是否始终包含在导航控制器中(作为根视图控制器或推送视图控制器)?是的,UITabBarController,4个选项卡,每个选项卡包含UINavControllers(具有向下钻取的UITableViewControllers)不起作用-从未调用UITabBarController呈现。当我选择我的选项卡时,或者当返回导航控制器堆栈时。只调用is UINavigationController,并且在两种情况下都调用。您有什么结构?我的想法是这样的:UITabBarController,一个页面带有自定义vc,另一个页面带有UINavigationController,可以推送相同的自定义vcYeah,UITabBarController,4个选项卡,每个选项卡都包含uinavControllers我必须将comingFromTab=false反转为true,因为在第一次加载时,它在第一次选择该选项卡时不起作用。交换它,使它100%工作。我不想使用TabBarDelegate,但似乎这是唯一的方法。