Методы подкласса UITabBarController недоступны на дочерних контроллерах просмотра?

#ios #swift #uiviewcontroller #uitabbarcontroller

#iOS #swift #uiviewcontroller #uitabbarcontroller

Вопрос:

Я пытаюсь вызвать пользовательский метод в моем UITabBarController подклассе из одного из дочерних контроллеров просмотра. Я создал экземпляр своего CustomTabBarController класса в качестве корневого контроллера просмотра в AppDelegate.swift , однако .tabBarController свойство на моих дочерних контроллерах просмотра относится к классу UITabBarController вместо CustomTabBarController .

Почему это происходит? Возможно ли, чтобы .tabBarController свойство на моих контроллерах просмотра отражало мой подкласс вместо UITabBarController класса по умолчанию?

Вот мой подкласс:

 import UIKit

class CustomTabBarController: UITabBarController, UITabBarControllerDelegate, LoginControllerDelegate {

  let defaults = UserDefaults.standard

  override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
    setupViews()
  }

  override func viewDidAppear(_ animated: Bool) {
    checkLoginStatus()
  }

  func checkLoginStatus() {
    if defaults.bool(forKey: "isLoggedIn") == false {
      let loginController = LoginController()
      loginController.delegate = self
      present(loginController, animated: true, completion: nil)
    }
  }

  func loginControllerDidDismiss() {
    print("Delegation is working...")
  }

  func setupViews() {
    let homeController = HomeController()
    homeController.tabBarItem = CustomTabBarItem(title: "Home", imageNames: ["courthouse-icon-unselected", "courthouse-icon"])
    let homeNavController = UINavigationController(rootViewController: homeController)
    homeNavController.navigationBar.applyCustomStyle()

    tabBar.tintColor = UIColor(red:0.18, green:0.34, blue:0.65, alpha:1.00)
    self.setViewControllers([homeNavController], animated: true)
  }

  func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    print(viewController.title)
    return true
  }

}
  

В моем контроллере просмотра я хотел бы получить доступ к этому классу следующим образом:

 import UIKit

class HomeController: ListController {

  override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "Home"
    self.tabBarController??? // Right now this is a UITabBarController, but I would like to it be a CustomTabBarController 
  }

}
  

Ответ №1:

Лучший подход — проверить, соответствует ли это тому, что вы считаете, и привести его так, чтобы компилятор знал правильный класс.

например:

     if let custom = self.tabBarController as? CustomTabBarController {
        custom.checkLoginStatus()
    } else {
        print("Unexpected controller (self.tabBarController)")
    }
  

Комментарии:

1. Не могу поверить, что я не пытался использовать его как правильный класс. Это имеет большой смысл, и для моего варианта использования это работает отлично! Спасибо!