gpt4 book ai didi

ios - 从应用程序委托(delegate)路由到特定的 View Controller 。 swift

转载 作者:搜寻专家 更新时间:2023-11-01 06:25:50 25 4
gpt4 key购买 nike

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

UITabBarController 作为具有 3 个选项卡的 rootViewController -> UINavigationController -> UIViewController(全部在 Storyboard中完成)

如所见:

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) 这行我可以看到数据已经设置好了,因为我所有来自其他 View Controller 的打印语句都是正在继续,但是我仍然停留在主页(选项卡栏上的第一个 View )并且用户没有被定向到正确的页面。

有人知道如何从应用程序委托(delegate)路由到另一个 View Controller ,同时仍将选项卡栏保持为根。谢谢。

这就是我想要的:

enter image description here

因此,从 appDelegate 开始,我想从选项卡栏转到导航 Controller ,然后到第一个 View Controller ,一直到最后一个 View Controller ,确保保留导航路径。我所做的是将数据传递给第一个 View Controller ,然后通过每个 View Controller 继续。但这不起作用。我认为这是由于我在其中设置 Root View Controller 的应用程序委托(delegate)。谢谢。

编辑

我找到了 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()

目前它不起作用,只是一个带有标签栏的空白屏幕。但是,将 Root View Controller 更改为 homeNavigationController 是可行的,只是标签栏不再存在。

最佳答案

如果我对您的理解是正确的,您希望在目标 View Controller 的状态下启动您的应用程序。如果应用已在运行,则此答案不适用。

首先,您需要实例化标签栏 Controller 。这将返回您在 Storyboard文件中构建的整个层次结构。 UITabBarControllerviewControllers 属性将包含您为不同选项卡设置的三个 UINavigationController。第一个导航 Controller 是与您的主页选项卡关联的。然后,您可以操作 UINavigationControllerviewControllers 属性来更改 View Controller 的初始堆栈。 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
}

您将无法使用这种方法通过 segues 传递数据,您也不应该这样做。在设置 firstVc 等时分配要在 View Controller 中显示的数据。

关于ios - 从应用程序委托(delegate)路由到特定的 View Controller 。 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54970462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com