如何将通用链接连接到 UIViewController?

Posted

技术标签:

【中文标题】如何将通用链接连接到 UIViewController?【英文标题】:How to connect Universal Links to UIViewController? 【发布时间】:2016-06-13 07:09:15 【问题描述】:

*免责声明:我只在 ios/XCode/Swift 中编码了几个星期

我有通用链接,点击我的应用程序外部的链接会打开应用程序,我在 AppDelegate 类中捕获 Url。

所以这一切都很好。

我的问题是......然后我如何重定向到正确的 UIViewController 并从我的 URL 向控制器传递一些信息?所有 Universal Link 教程在到达那部分之前就停止了。

特别是我对 AppDelegate 的生命周期以及它与 UIViewController 的关系感到困惑。

我的应用有两个 UIViewController(对吗?)一个 UINavigationController。

我尝试过的

我尝试在 AppDelegate 中处理 url 事件,并设置一个公共属性,然后在我的 ViewController 中访问 AppDelegate。但是,单击通用链接后,viewDidLoadviewWillAppear 都不会再次被调用:-/

从 AppDelegate 重定向到 ViewController 的最佳方式是什么?我的目标只是加载根视图控制器,但我需要从 URL 传递一些数据。怎么样?

【问题讨论】:

在url中放一些参数,然后在AppDelegate中就可以插入打开右视图控制器的逻辑。您可以尝试类似 www.example.com?key=parameter 谢谢!但问题是我如何导航到 ViewComtroller 并传递该数据。这就是问题所在! :-) 【参考方案1】:

    首先,阅读您的网址。

    从 URL 获取参数

    启动你的目标控制器

    将您的参数设置为该控制器

    根视图控制器上的当前控制器

         let urlString = url.absoluteString
         let queryArray = urlString.componentsSeparatedByString("/")
    
         if queryArray[2].lowercaseString == "yourQuery" 
             let queryId = Int(queryArray[3])
    
             if self.window?.rootViewController?.presentedViewController != nil 
                 self.window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
             
    
             let queryVC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier(QUERY_SCENE) as? QueryViewController
             queryVC?.urlQueryId = queryId!
             self.window?.rootViewController?.presentViewController(queryVC!, animated: true, completion: nil)
        
    

编辑:

    在导航控制器上推一个控制器说“PresentedViewController”,如果 rootViewController 也是导航控制器

    然后在控制器“OnBackPressViewController”上的后按当前控制器“PresentedViewController”

         if self.window?.rootViewController?.presentedViewController != nil 
             self.window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
         
         let navController = self.window?.rootViewController?.storyboard?.instantiateInitialViewController() as? UINavigationController
         let presentedVC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier(PRESENTED_SCENE) as? PresentedViewController
         //Pass parameters to PresentedViewController
         let onBackPressViewController = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier(ON_BACK_PRESS_SCENE) as? OnBackPressViewController
         navController!.pushViewController(onBackPressViewController!, animated: true)
         navController!.pushViewController(presentedVC!, animated: true)
         self.window?.rootViewController?.presentViewController(navController!, animated: true, completion: nil)
    

您可以据此更新您的代码。永远记住,你必须在 rootViewController 上呈现任何视图控制器。

【讨论】:

老兄,现在就试试这个,但感谢您的详尽解释!马上试试。 另外,如果您使用您正在使用或喜欢展示或推送的控制器类型更新问题,将会更有帮助 谢谢拉利特!!!那行得通。我的错....我对此真的很陌生,我将添加我正在使用的控制器。 如果我不使用 UINavController 那么它将如何工作?【参考方案2】:

这取决于您的应用架构。您绝对可以假设 AppDelegate 引用了rootViewController (window?.rootViewController)。您应该知道该控制器的类型。然后就可以访问其他的了,以此类推。无论如何,在我看来,这个问题太笼统了。

【讨论】:

谢谢!我想我可以看起来它看起来很通用,但也许那是因为我对它很陌生,我需要更多关于如何导航到控制器的指导。就像......是的,我看到我确实可以访问根控制器......但是我如何导航到它并传递一个参数,知道我的意思吗? RootViewController 应该是 UITabBarControllerUINavigationController。然后就可以访问到具体的控制器了(通过访问viewControllers数组)

以上是关于如何将通用链接连接到 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建通用数据库连接服务

无法使用通用身份验证连接到设备“192.168.1.17”

如何将 spyder 连接到 postgres 数据库?

如何将 Weka 连接到 MSSQL 服务器

如何将 kivy 应用程序连接到 Android 已安装的应用程序

如何将TCP连接重新连接到同一端口?