从应用程序委托路由到特定视图控制器。迅速

问题描述 投票:1回答:1

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

UITabBarController作为rootViewController,带有3个选项卡 - > 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)行我可以看到数据已经设置,因为我正在查看其他视图控制器的所有打印语句,但是我仍然停留在homePage(标签栏上的第一个视图)和用户未定向到正确的页面。

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

这就是我所追求的:

enter image description here

所以从appDelegate,我想从标签栏到导航控制器,然后到第一个视图控制器一直到最终视图控制器,确保我保持导航路径。我所做的是将数据传递给第一个视图控制器然后逐个扫描。但这不起作用。我认为这是由于我在设置根视图控制器的app委托。谢谢。

编辑

我发现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工作,它只是标签栏不再存在。

ios swift deep-linking
1个回答
3
投票

如果我正确理解您,您希望将应用程序置于目标视图控制器的状态。如果应用程序已在运行,则此答案不适用。

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

func setupAppFromDeeplink() {
    let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
    let homeNavigationController = tabBarController.viewControllers?.first as! UINavigationController

    let firstVc = UIViewController() 
    let secondVc = UIViewController()
    let thirdVc = UIViewController()

    homeNavigationController.viewControllers = [firstVc, secondVc, thirdVc]

    window!.rootViewController = tabBarController
}

使用这种方法,您将无法通过segue传递数据,也不应该。设置qazxsw poi等时,分配要在视图控制器中显示的数据。

© www.soinside.com 2019 - 2024. All rights reserved.