如何显示特定的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)
        }
    }

但这是一个丑陋的表现,我需要类似洞导航堆栈...

而且,如果我想通过通用链接处理更多内容,我可以为此制作一个帮助类吗?任何建议都表示赞赏。

答案

你需要使用你的.viewControllersUINavigationController属性,你可以使用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的主要内容,如果未能解决你的问题,请参考以下文章

如何在导航控制器 SWIFT 中显示视图控制器

导航视图控制器不显示后退按钮

如何返回导航堆栈?

在全屏模式演示样式中使用 segue 时如何仍然显示导航栏?

如何导航回更正以前的viewController

如何在 Swift 上从最后一个 VC 更改为中间 VC