Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.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 从应用程序委托路由到特定视图控制器。敏捷的_Ios_Swift_Deep Linking - Fatal编程技术网

Ios 从应用程序委托路由到特定视图控制器。敏捷的

Ios 从应用程序委托路由到特定视图控制器。敏捷的,ios,swift,deep-linking,Ios,Swift,Deep Linking,我正在使用Firebase动态链接,并跟随Firebase在线视频。在处理传入的URL后,我想将用户路由到应用程序上的特定页面。我的应用程序结构如下所示 UITabBarController作为rootViewController,具有3个选项卡->UINavigationController->UIViewController(全部在情节提要中完成) 如图所示: 当我得到一个特定的URL时,我想进入第一个包含一些数据的选项卡,然后从那里将用户发送到正确的页面。这确保用户仍然可以通过导航返回

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

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

如图所示:

当我得到一个特定的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)
我可以看到数据已经设置完毕,因为我的所有打印语句都来自其他视图控制器,这些视图控制器正在被分割,但是我仍然停留在主页上(选项卡栏上的第一个视图)并且用户没有被引导到正确的页面

是否有人知道如何从应用程序代理路由到另一个视图控制器,同时仍将选项卡栏保留为根。多谢各位

这就是我想要的:

因此,从appDelegate,我想从选项卡栏转到导航控制器,然后转到第一个视图控制器,一直到最后一个视图控制器,确保保留导航路径。我要做的是将数据传递给第一个视图控制器,然后依次传递每个视图控制器。但这不起作用。我想这是因为我在应用程序委托中设置了根视图控制器。多谢各位

编辑

我找到了一个和我相似的帖子的答案

我的代码现在如下所示:

    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
有效,只是选项卡栏不再存在。

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

首先,您需要实例化选项卡栏控制器。这将返回您在故事板文件中构建的整个层次结构。
uitabarcontroller
viewControllers
属性将包含为不同选项卡设置的三个
UINavigationController
。第一个导航控制器是与“主页”选项卡关联的控制器。然后,您可以操纵
UINavigationController
viewControllers
属性来更改视图控制器的初始堆栈
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
}

使用这种方法,您将无法通过分段传递数据,您也不应该这样做。设置
firstVc
等时,指定要在视图控制器中显示的数据。

谢谢。我将如何设置数据?这会是一个初始值设定项吗?我真正想做的就是将用户带到第一个VC,并使用URL中的数据。我不想以任何方式更改应用程序。没有办法做到这一点吗?@AndrewHarris当你设置视图控制器时(或者像我一样使用init,或者通过脚本id获取它们),你对视图控制器的引用与你在序列中的引用相同。在我的示例中,如果
firstVc
有一个名为
url
的属性,您可以通过执行
firstVc.url=yourdepinkurl