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

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

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

您需要使用UINavigationController.viewControllers属性,您可以使用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,因为他们将免费为您处理此问题,并且他们通过回调传递元数据而不是链接参数,这将使您的链接更强大。 无论如何…

从UINavigationViewController开始

这包括一个rootViewController ,它应该是你主页面的一个实例。 将此导航视图控制器存储为实例变量,以便您的应用程序仅在启动时处理一个导航视图控制器。 如果您正在使用故事板,那么您只需获得对该导航视图控制器的引用:

self.nav = self.window?.rootViewController as? UINavigationViewController

推送vs将视图控制器呈现在导航上

当您收到链接并确定需要将该用户带到新页面时,您应决定是否推送或显示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)