Установка Контейнерного Контроллера (Root View Controller) как Делегата для Контроллеров Представления в UITabBarController - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь установить контроллер контейнера (Root View Controller) в качестве делегата для элемента панели навигации для контроллера представления в контроллере панели вкладок и не могу понять, как это сделать без использования:

let rootViewController = UIApplication.shared.keyWindow?.rootViewController

Этот код работает так, как я хотел бы:

 let rootViewController = UIApplication.shared.keyWindow?.rootViewController

    guard let doghouseViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DoghouseVC") as? DoghouseViewController else { return }
    doghouseViewController.delegate = rootViewController as? DoghouseViewControllerDelegate
    let nav1 = UINavigationController(rootViewController: doghouseViewController)
    guard let statsViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "StatsVC") as? StatsViewController else { return }
    statsViewController.delegate = rootViewController as? StatsViewControllerDelegate
    let nav2 = UINavigationController(rootViewController: statsViewController)

    dailyWrapUpViewController = DailyWrapUpViewController()

    guard let calendarViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CalendarVC") as? CalendarViewController else { return }
    calendarViewController.delegate = rootViewController as? CalendarViewControllerDelegate
    let nav3 = UINavigationController(rootViewController: calendarViewController)
    guard let settingsViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SettingsVC") as? SettingsViewController else { return }
    settingsViewController.delegate = rootViewController as? SettingsViewControllerDelegate
    let nav4 = UINavigationController(rootViewController: settingsViewController)

    doghouseViewController.tabBarItem = UITabBarItem(title: "Doghouse", image: UIImage(named: "doghouse"), tag: 0)
    statsViewController.tabBarItem = UITabBarItem(title: "Stats", image: UIImage(named: "stats"), tag: 1)

    // Custom Doggy Bag Button
    let controller2 = UIViewController()

    calendarViewController.tabBarItem = UITabBarItem(title: "Calendar", image: UIImage(named: "calendar"), tag: 3)
    settingsViewController.tabBarItem = UITabBarItem(title: "More", image: UIImage(named: "more"), tag: 4)

    viewControllers = [nav1, nav2, controller2, nav3, nav4]

    // Use the view controller reference to select the second tab
    selectedViewController = nav1

Но 'keyWindow' устарел в iOS 13.0, и если я пытаюсь изменить его, используя следующее как Например, функция делегата не работает (кнопка нажимается, но экземпляр контроллера контейнера не получает):

let rootViewController = UIApplication.shared.windows.first!.rootViewController as! ContainerController

Для большего контекста контроллер контейнера (Root View Controller) является боковым меню который выдвигается на кране элемента NavBar в TabBarController.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 18 апреля 2020

Разобрался:

let sceneDelegate = UIApplication.shared.connectedScenes.first!.delegate as! SceneDelegate

    guard let doghouseViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DoghouseVC") as? DoghouseViewController else { return }
    doghouseViewController.delegate = sceneDelegate.window!.rootViewController as? DoghouseViewControllerDelegate
    let nav1 = UINavigationController(rootViewController: doghouseViewController)
    guard let statsViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "StatsVC") as? StatsViewController else { return }
    statsViewController.delegate = sceneDelegate.window!.rootViewController as? StatsViewControllerDelegate
    let nav2 = UINavigationController(rootViewController: statsViewController)

    dailyWrapUpViewController = DailyWrapUpViewController()

    guard let calendarViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CalendarVC") as? CalendarViewController else { return }
    calendarViewController.delegate = sceneDelegate.window!.rootViewController as? CalendarViewControllerDelegate
    let nav3 = UINavigationController(rootViewController: calendarViewController)
    guard let settingsViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SettingsVC") as? SettingsViewController else { return }
    settingsViewController.delegate = sceneDelegate.window!.rootViewController as? SettingsViewControllerDelegate
    let nav4 = UINavigationController(rootViewController: settingsViewController)

    doghouseViewController.tabBarItem = UITabBarItem(title: "Doghouse", image: UIImage(named: "doghouse"), tag: 0)
    statsViewController.tabBarItem = UITabBarItem(title: "Stats", image: UIImage(named: "stats"), tag: 1)

    // Custom Doggy Bag Button
    let controller2 = UIViewController()

    calendarViewController.tabBarItem = UITabBarItem(title: "Calendar", image: UIImage(named: "calendar"), tag: 3)
    settingsViewController.tabBarItem = UITabBarItem(title: "More", image: UIImage(named: "more"), tag: 4)

    viewControllers = [nav1, nav2, controller2, nav3, nav4]

    // Use the view controller reference to select the second tab
    selectedViewController = nav1
...