如何显示特定的VC,更像是导航到一堆VC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何显示特定的VC,更像是导航到一堆VC相关的知识,希望对你有一定的参考价值。
所以我在我的应用程序中实现了通用链接,当按下按钮时,我打开了我的第二个应用程序:
UIApplication.shared.open(aUrl!)
我也接到了电话:
func应用程序(_应用程序:UIApplication,继续userActivity:NSUserActivity,restorationHandler:@escaping([Any]?) - > Void) - > Bool {}
这是一个警报。
问题就像标题所说..我可以导航到一个特定的VC,(从FirstApp到第二个我用通用链接打开它),更像是映射一个navigation controller stack
。
我写了类似的东西:
if let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MyAdsController") as? MyAdsViewController {
if let window = self.window, let rootViewController = window.rootViewController {
var currentController = rootViewController
while let presentedController = currentController.presentedViewController {
currentController = presentedController
}
currentController.present(controller, animated: true, completion: nil)
}
}
但这是一个丑陋的表现,我需要类似洞导航堆栈...
而且,如果我想通过通用链接处理更多内容,我可以为此制作一个帮助类吗?任何建议都表示赞赏。
你需要使用你的.viewControllers
的UINavigationController
属性,你可以使用setViewControllers(_:animated:)
方法或直接修改.viewControllers
属性,其中rootViewController
将是viewControllersArray[0]
和topViewController
将是viewControllersArray[count-1]
此属性说明和详细信息可以在UINavigationController
文档中找到
viewControllers
属性
视图控制器当前位于导航堆栈上。
声明SWIFT
var viewControllers: [UIViewController]
讨论根视图控制器位于数组中的索引0处,后视图控制器位于索引n-2处,顶部控制器位于索引n-1处,其中n是数组中的项目数。
为此属性分配新的视图控制器数组等效于调用setViewControllers:animated:方法,并将animated参数设置为false。
例
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let firstViewController = storyboard.instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController
let secondViewController = storyboard.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController
let thirdViewController = storyboard.instantiateViewController(withIdentifier: "ThirdViewController") as? ThirdViewController
self.navigationController?.setViewControllers([firstViewController,secondViewController,thirdViewController], animated: false)
好吧,这不是一个环球链接问题,而是更多的导航偏好。当您在continueUserActivity
函数中传递通用链接时,您应该解析它并相应地从您的应用程序代理导航。您应该将您的Universal Link处理切换到Branch,因为他们将免费为您处理此问题,并且他们通过回调传递元数据而不是链接参数,这将使您的链接更强大。无论如何...
Start with a UINavigationViewController
这包括有一个rootViewController
,它应该是你主页面的一个实例。将此导航视图控制器存储为实例变量,以便您的应用程序仅在启动时处理一个导航视图控制器。如果您正在使用故事板,那么您只需获得对该导航视图控制器的引用:
self.nav = self.window?.rootViewController as? UINavigationViewController
Pushing vs presenting a View Controller onto Nav
当您收到链接并确定需要将该用户带到新页面时,您应该决定是推送还是呈现VC。
推动
如果您希望将该视图作为堆栈的一部分进行维护,则必须进行推送。例如,如果您想向用户显示一双鞋子,您可能希望将它们带入鞋子类别,然后将它们与鞋子细节控制器一起展示。在这种情况下,您可以将用户带到主页并将正确的导航堆栈推送到UINavigationViewController上。
self.nav.popToRootViewController(animated: true)
self.nav.pushViewController(firstController, animated: true)
self.nav.pushViewController(secondViewController, animated: true)
这样,您的用户UINavigationController堆栈将看起来像root> firstVC> secondVC,并且它们将具有面包屑以便能够遍历流。
呈现
如果您不想将视图推送到堆栈。也许你想要提供一个弹出窗口,无论他们在应用程序中的位置,你不想搞砸他们的位置,你应该使用现在的VC。这将简单地在整个NavigationController上呈现一个ViewController,而不会被添加到NavigationController的堆栈中。
self.nav.presentViewController(modalVC, animated:true, completion: nil)
从那个modalVC
你可以打电话
self.dismiss(animated: true, completion: nil)
以上是关于如何显示特定的VC,更像是导航到一堆VC的主要内容,如果未能解决你的问题,请参考以下文章