3

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

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

所以这一切都很好。

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

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

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

我试过的

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

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

4

2 回答 2

4
  1. 首先,阅读您的网址。

  2. 从 URL 获取参数

  3. 启动你的目标控制器

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

  5. 在根视图控制器上显示控制器

         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)
        }
    

编辑:

  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)
    

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

于 2016-06-13T08:49:20.553 回答
0

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

于 2016-06-13T07:49:00.297 回答