#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. Не могу поверить, что я не пытался использовать его как правильный класс. Это имеет большой смысл, и для моего варианта использования это работает отлично! Спасибо!