如何将Universal Links连接到UIViewController?

时间:2016-06-13 07:09:15

标签: ios swift xcode7 ios-universal-links

  

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

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

所以这一切都很好。

我的问题是......我如何重定向到正确的UIViewController并从我的URL传递控制器一些信息?所有Universal Link教程都会在它们到达之前停止。

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

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

我尝试了什么

我已尝试在AppDelegate中处理url事件,并设置公共属性,然后在我的ViewController中获取对AppDelegate的访问权限。但是,点击通用链接后,string input = "Documents/Z_Documentation/PDF/sales.2010+Implementation+Revised+Feb10.pdf"; string output = input.Split(new string[] { "/PDF/" }, StringSplitOptions.None).First() + "/PDF/doc123"; viewDidLoad都不会再次被调用: - /

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

2 个答案:

答案 0 :(得分:1)

  1. 首先,阅读您的网址。
  2. 从网址
  3. 获取参数
  4. 启动目标控制器
  5. 将参数设置为该控制器
  6. 在根视图控制器上显示控制器

        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)
       }
    
  7. 修改:如果您要执行以下操作。

    1. 按下一个控制器说“PresentedViewController'在导航控制器上,如果rootViewController也是导航控制器
    2. 然后按下控制器' 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)
      
    3. 您可以根据该更新代码。永远记住你必须在rootViewController上呈现任何视图控制器。

答案 1 :(得分:0)

这取决于您的应用架构。您绝对可以假设AppDelegate具有对rootViewControllerwindow?.rootViewController)的引用。你应该知道那个控制器的类型是什么。然后你可以访问另一个,依此类推。无论如何,这个问题在我看来太过通用了。