Маршрутизация к определенному контроллеру представления от делегата приложения.стриж - PullRequest
0 голосов
/ 03 марта 2019

Я использую динамические ссылки Firebase и следую вместе с онлайн-видео Firebase.После обработки входящего URL-адреса я хочу направить пользователя на определенную страницу в приложении.Моя структура приложения выглядит следующим образом.

UITabBarController в качестве rootViewController с 3 вкладками -> UINavigationController -> UIViewController (все сделано в раскадровках)

как видно:

enter image description here

Когда я получаю определенный URL, я хочу затем перейти на первую вкладку с некоторыми данными, а затем оттуда отправить пользователя на правильную страницу.Это гарантирует, что пользователь все еще сможет вернуться через навигацию.

Я пытался добиться этого через это:

var storyBoard = UIStoryboard()
    storyBoard = UIStoryboard(name: "Main", bundle: nil)

    let tabViewController = storyBoard.instantiateViewController(withIdentifier: "tabBar") as! TabBar

    let homeVC = storyBoard.instantiateViewController(withIdentifier: "homePage") as! NewHomeViewController
    homeVC.navigatorItem = DeepLinkItem(listId: mediaID, itemId: itemID)

    let appdelegate = UIApplication.shared.delegate as! AppDelegate
    appdelegate.window!.rootViewController = tabViewController

С помощью строки homeVC.navigatorItem = DeepLinkItem(listId: mediaID, itemId: itemID) я вижу, что данныебыл задан из-за того, что все мои операторы печати от других контроллеров представления находятся в очереди, однако я все еще застрял на homePage (первое представление на панели вкладок), и пользователь не перенаправлен на правильную страницу.

Кто-нибудь знает, как маршрутизировать другой контроллер представления из делегата приложения, сохраняя панель вкладок в качестве корневого элемента.Спасибо.

Это то, что мне нужно:

enter image description here

Итак, из приложения Delegate я хочу перейти с панели вкладокк контроллеру навигации, затем к первому контроллеру представления вплоть до конечного контроллера просмотра, следя за тем, чтобы я сохранил путь навигации.Что я делаю, так это передаю данные первому контроллеру представления, затем прохожу через каждый.Но это не работает.Я думаю, что это связано с делегатом приложения, где я устанавливаю контроллер корневого представления.Спасибо.

РЕДАКТИРОВАТЬ

Я нашел этот ответ на пост, похожий на мой.

Мой код теперь выглядит так:

    let mainStoryBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let tabBarController = mainStoryBoard.instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
    let homeNavigationController = tabBarController.viewControllers?.first as! UINavigationController
    let homeView = mainStoryBoard.instantiateViewController(withIdentifier: "homePage") as! NewHomeViewController

    homeView.navigatorItem = DeepLinkItem(listId: mediaID, itemId: itemID)

    homeNavigationController.pushViewController(homeView, animated: false)

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = tabBarController
    self.window?.makeKeyAndVisible()

На данный момент он не работает, просто пустой белый экран с панелью вкладок.Однако, изменение корневого контроллера представления на homeNavigationController работает, его просто нет панели вкладок.

1 Ответ

0 голосов
/ 03 марта 2019

Если я правильно вас понимаю, вы хотите запустить свое приложение в состоянии, когда оно находится в контроллере целевого представления.Этот ответ не применяется, если приложение уже запущено.

Прежде всего, вам нужно создать экземпляр контроллера панели вкладок.Это вернет всю иерархию, которую вы создали в файле раскадровки.Свойство viewControllers вашего UITabBarController будет содержать три UINavigationController, которые вы настроили для разных вкладок.Первый навигационный контроллер - тот, который связан с вашей домашней вкладкой.Затем вы можете манипулировать свойством viewControllers UINavigationController, чтобы изменить начальный стек контроллеров представления.UINavigationController всегда будет показывать последний, поэтому в этом примере thirdVc - это тот, что показан на главной вкладке.

func setupAppFromDeeplink() {
    let tabBarController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tabBar") as! UITabBarController
    let homeNavigationController = tabBarController.viewControllers?.first as! UINavigationController

    let firstVc = UIViewController() 
    let secondVc = UIViewController()
    let thirdVc = UIViewController()

    homeNavigationController.viewControllers = [firstVc, secondVc, thirdVc]

    window!.rootViewController = tabBarController
}

Вы не сможете передавать данные через сегменты через этот подход,и не должен.Назначьте данные, которые будут отображаться в контроллере вида при настройке firstVc и т. Д.

...