从应用程序委托路由到特定的视图控制器。斯威夫特

时间:2019-03-03 15:33:38

标签: ios swift deep-linking

我正在使用Firebase动态链接,并跟随着Firebase在线视频。处理传入的URL之后,我想将用户路由到应用程序上的特定页面。我的应用程序结构如下所示。

UITabBarController作为带有3个选项卡的rootViewController-> UINavigationController-> UIViewController(全部在情节提要中完成)

如图所示:

enter image description here

当我获得一个特定的URL时,我想转到带有一些数据的第一个选项卡,然后从那里将用户发送到正确的页面。这样可以确保用户仍然可以通过导航返回。

我试图通过以下方法实现这一目标:

var storyBoard = UIStoryboard()
    storyBoard = UIStoryboard(name: "Main", bundle: nil)

    let tabViewController = storyBoard.instantiateViewController(withIdentifier: "tabBar") as! TabBar

    let homeVC = storyBoard.instantiateViewController(withIdentifier: "homePage") as! NewHomeViewController
    homeVC.navigatorItem = DeepLinkItem(listId: mediaID, itemId: itemID)

    let appdelegate = UIApplication.shared.delegate as! AppDelegate
    appdelegate.window!.rootViewController = tabViewController

在第homeVC.navigatorItem = DeepLinkItem(listId: mediaID, itemId: itemID)行中,我看到由于其他视图控制器的所有打印语句都被隔离,因此数据已经设置完毕,但是我仍然停留在主页上(第一个视图在标签栏上),并且用户没有被定向到正确的页面。

有人知道如何从应用程序委托路由到另一个视图控制器,同时仍然保持选项卡栏为根。谢谢。

这就是我所追求的:

enter image description here

因此,从appDelegate,我想从选项卡栏转到导航控制器,然后一直到第一个视图控制器,一直到最终视图控制器,确保我保持导航路径。我要做的是将数据传递给第一个视图控制器,然后逐个选择。但这是行不通的。我认为这是由于我在设置根视图控制器的应用程序委托。谢谢。

编辑

我找到了this个类似于我的帖子的答案。

我的代码现在看起来像这样:

    let mainStoryBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let tabBarController = mainStoryBoard.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
    let homeNavigationController = tabBarController.viewControllers?.first as! UINavigationController
    let homeView = mainStoryBoard.instantiateViewController(withIdentifier: "homePage") as! NewHomeViewController

    homeView.navigatorItem = DeepLinkItem(listId: mediaID, itemId: itemID)

    homeNavigationController.pushViewController(homeView, animated: false)

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = tabBarController
    self.window?.makeKeyAndVisible()

此刻不起作用,只有空白的带有选项卡栏的白色屏幕。但是,将根视图控制器更改为homeNavigationController是可行的,它的标签栏不再存在。

1 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,那么您希望在目标视图控制器处启动应用程序。如果应用程序已在运行,则此答案不适用。

首先,您需要实例化标签栏控制器。这将返回您在情节提要文件中构建的整个层次结构。 viewControllers的{​​{1}}属性将包含您为不同标签设置的三个UITabBarController。第一个导航控制器是与您的主页选项卡关联的控制器。然后,您可以操纵UINavigationController的{​​{1}}属性来更改视图控制器的初始堆栈。 viewControllers将始终显示最后一个,因此在此示例中,UINavigationController是主页选项卡中显示的那个。

UINavigationController

使用这种方法,您将无法传递数据槽序列,您也不应。设置设置thirdVc等时在视图控制器中显示的数据。