Привет! Я пытаюсь применить шаблон FlowController в своем проекте, однако у меня возникли проблемы с поиском способа применить его к моему UITabBarController
.
Это поток моего приложения:
AppFlowController -> either AuthenticationFlowController
Или MainTabFlowController -> From MainTabFlowController
Я не знаю, как я могу настроить свой контроллер потока вкладок. У меня есть 3 вкладки, и у каждой вкладки есть свои потоки и свои UINavitaionController
Мне нужна помощь с настройкой MainTabFlowController
.
Это мой AppFlowController
import UIKit
import Firebase
class AppFlowController: FlowController {
private var authenticationFlowController: AuthenticationFlowController?
override func start() {
super.start()
checkAuthenticationStatus()
}
private func showMain() {
let mainTabFlowController = MainTabFlowController()
addChild(mainTabFlowController, to: view, animation: nil)
mainTabFlowController.start()
}
private func showAuthentication() {
authenticationFlowController = AuthenticationFlowController()
authenticationFlowController!.delegate = self
addChild(authenticationFlowController!, to: view, animation: nil)
authenticationFlowController!.start()
}
private func checkAuthenticationStatus() {
if Auth.auth().currentUser == nil {
showAuthentication()
} else {
showMain()
}
}
}
extension AppFlowController: AuthenticationFlowControllerDelegate {
func userDidAuthenticated() {
authenticationFlowController?.removeChild()
showMain()
}
}
После некоторых проб и ошибок, наконец, у меня, кажется, все работает. Однако я не уверен, правильно ли я это делаю или нет, но это работает. Если кто-то может помочь мне взглянуть и сказать, правильно ли это реализовано, это было бы очень полезно. Спасибо!
import UIKit
class MainTabFlowController: FlowController {
override func start() {
super.start()
let mainTabBarController = UITabBarController()
let flowControllers = createTabFlowControllers()
mainTabBarController.viewControllers = flowControllers.map({ UINavigationController(rootViewController: $0) })
mainTabBarController.tabBar.tintColor = .white
mainTabBarController.tabBar.unselectedItemTintColor = .black
mainTabBarController.tabBar.isTranslucent = false
mainTabBarController.tabBar.barTintColor = Theme.primary
guard let items = mainTabBarController.tabBar.items else { return }
for item in items {
item.title = ""
item.imageInsets = UIEdgeInsets.init(top: 6, left: 0, bottom: -6, right: 0)
}
addChild(mainTabBarController, to: view, animation: nil)
}
private func createTabFlowControllers() -> [FlowController] {
var flowControllers = [FlowController]()
let homeTabFlowController = HomeTabFlowController()
homeTabFlowController.title = "Trang chủ"
homeTabFlowController.tabBarItem.image = #imageLiteral(resourceName: "ic_home")
homeTabFlowController.start()
flowControllers.append(homeTabFlowController)
let pigDataTabFlowController = PigDataTabFlowController()
pigDataTabFlowController.title = "Quản lý dữ liệu heo"
pigDataTabFlowController.tabBarItem.image = #imageLiteral(resourceName: "ic_storage")
pigDataTabFlowController.start()
flowControllers.append(pigDataTabFlowController)
let settingsTabFlowController = SettingsTabFlowController()
settingsTabFlowController.title = "Cài đặt"
settingsTabFlowController.tabBarItem.image = #imageLiteral(resourceName: "ic_settings")
settingsTabFlowController.start()
flowControllers.append(settingsTabFlowController)
flowControllers.forEach {
configureNavigationBar(for: $0)
}
return flowControllers
}
private func configureNavigationBar(for viewController: UIViewController) {
let customView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width / 2 + 40, height: 44))
let button = UIButton.init(type: .custom)
button.setImage(#imageLiteral(resourceName: "ic_menu_style"), for: .normal)
button.imageView?.contentMode = .scaleAspectFit
button.frame = CGRect(x: -8, y: 0, width: 44, height: 44)
// button.addTarget(self, action: #selector(menuOpen(button:)), for: .touchUpInside)
customView.addSubview(button)
let marginX = CGFloat(button.frame.origin.x + button.frame.size.width + 5)
let label = UILabel(frame: CGRect(x: marginX, y: 0, width: self.view.frame.width / 2, height: 44))
label.text = viewController.title
label.textColor = Theme.titleTextOrIcon
label.font = UIFont(name: Theme.mediumFont, size: 18)
customView.addSubview(label)
let leftButton = UIBarButtonItem(customView: customView)
viewController.navigationItem.leftBarButtonItem = leftButton
viewController.title = ""
}
}