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