Как подключить универсальные ссылки к UIViewController?
* Отказ от ответственности: я только кодировал в iOS/XCode/Swift в течение нескольких недель
У меня есть Universal Links, работающая в том, что, щелкая ссылку вне моего приложения, вы открываете приложение, и я перехватываю URL в классе AppDelegate.
Так что все хорошо.
У меня вопрос... как мне тогда перенаправить на правильный UIViewController И передать контроллеру некоторую информацию из моего URL? Все учебники Universal Link останавливаются до того, как они перейдут к этой части.
В частности, я запутался в жизненных циклах AppDelegate и в том, как он связан с UIViewController.
У моего приложения было два UIViewController, сидящий под (верно?) UINavigationController.
Что я пробовал
Я попытался обработать событие url в AppDelegate и установить открытое свойство, а затем в моем ViewController получить доступ к AppDelegate. ОДНАКО после нажатия на Универсальную ссылку, оба viewDidLoad
а также viewWillAppear
не звони снова:-/
Какой лучший способ перенаправить на ViewController из AppDelegate? Моя цель - просто загрузить контроллер корневого представления, НО мне нужно передать некоторые данные из URL. Как?
2 ответа
- Сначала прочитайте ваш URL.
- Получите ваши параметры из 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.
Это зависит от архитектуры вашего приложения. Вы можете определенно предположить, что AppDelegate имеет ссылку на rootViewController
(window?.rootViewController
). Вы должны знать, какой тип этого контроллера. Тогда вы можете получить доступ к другому и так далее. Этот вопрос, во всяком случае, слишком общий на мой взгляд.