Шаблон FlowController и UITabBarController - PullRequest
0 голосов
/ 17 января 2019

Привет! Я пытаюсь применить шаблон 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 = ""
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...