Как подключить Universal Links к UIViewController?

* Отказ от ответственности: я программировал в iOS/XCode/Swift всего пару недель.

У меня есть универсальные ссылки, работающие в том, что щелчок по ссылке вне моего приложения открывает приложение, и я перехватываю URL-адрес в классе AppDelegate.

Так что все хорошо.

Мой вопрос: как мне перенаправить на правильный UIViewController И передать контроллеру некоторую информацию из моего URL-адреса? Все учебные пособия по универсальной ссылке останавливаются, не дойдя до этой части.

В частности, я запутался в жизненном цикле AppDelegate и в том, как он связан с UIViewController.

В моем приложении было два UIViewController, сидящих (это правильно?) под UINavigationController.

Что я пробовал

Я попытался обработать событие URL-адреса в AppDelegate и установить общедоступное свойство, а затем в моем ViewController получить доступ к AppDelegate. ОДНАКО, после нажатия универсальной ссылки viewDidLoad и viewWillAppear больше не вызываются :-/

Как лучше всего перенаправить на ViewController из AppDelegate? Моя цель - просто загрузить контроллер корневого представления, НО мне нужно передать некоторые данные из URL-адреса. Как?


person andy    schedule 13.06.2016    source источник
comment
Поместите некоторые параметры в URL-адрес, затем в AppDelegate вы можете вставить логику, чтобы открыть правильный контроллер представления. Вы можете попробовать что-то вроде www.example.com?key=parameter   -  person lubilis    schedule 13.06.2016
comment
Спасибо! Но вопрос в том, КАК перейти к ViewComtroller и передать эти данные. Это вопрос! :-)   -  person andy    schedule 13.06.2016


Ответы (2)


  1. Во-первых, прочитайте свой URL.

  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.

person Lalit Kumar    schedule 13.06.2016
comment
чувак, сейчас попробую, но спасибо за подробное объяснение! Попробую прямо сейчас. - person andy; 13.06.2016
comment
Кроме того, будет более полезно, если вы обновите вопрос о том, какой тип контроллеров вы используете или хотите представить или нажать. - person Lalit Kumar; 13.06.2016
comment
Спасибо Лалит!!! Это сработало. Мой плохой .... Я действительно новичок в этом, я добавлю, какие контроллеры я использую. - person andy; 13.06.2016
comment
если бы я не использовал UINavController, то как бы это работало? - person andy; 13.06.2016

Это зависит от архитектуры вашего приложения. Вы можете определенно предположить, что AppDelegate имеет ссылку на rootViewController (window?.rootViewController). Вы должны знать, какой тип этого контроллера. Затем вы можете получить доступ к другому и так далее. В любом случае, на мой взгляд, этот вопрос слишком общий.

person Luca D'Alberti    schedule 13.06.2016
comment
Благодарность! Я думаю, мне может показаться, что это может показаться общим, но, возможно, это потому, что я новичок в этом, мне нужно немного больше указаний о том, как перейти к контроллеру. Например... да, я вижу, что у меня есть доступ к корневому контроллеру... но как мне перейти к нему И передать ему параметр, понимаете, о чем я? - person andy; 13.06.2016
comment
RootViewController должен быть UITabBarController или UINavigationController. Затем вы можете получить доступ к конкретному контроллеру (получив доступ к массиву viewControllers) - person Luca D'Alberti; 13.06.2016