Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 确定视图将从弹出的UINavigationController或UITabBarController中显示_Ios_Swift_Uinavigationcontroller_Uitabbarcontroller_Viewwillappear - Fatal编程技术网

Ios 确定视图将从弹出的UINavigationController或UITabBarController中显示

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

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

我想调用ViewWill中的方法,它仅在从选项卡栏显示视图时出现,而不是在有人按下导航控制器时出现

如果我没有使用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按钮或按下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,但似乎这是唯一的方法。