Как UITabBarController вписывается в архитектуру VIPER?

Я пишу приложение с навигацией на основе TabBar. Я принимаю архитектуру VIPER, но я действительно смущен тем, как следует менять вкладку UITabBarController.

Ответы

Ответ 1

Это может быть поздно, но это может быть полезно для других. Моим вариантом использования было внедрение tabBarController после экрана входа в систему. Могут быть много способов сделать это в VIPER, но я сделал это следующим образом:

  • Выделенный TabBar вручную, без использования раскадровки.
  • Создайте новый класс WireFrame только для презентации TabBarWireframe.
  • Создайте одноэлементный класс с одним изменяемым массивом, который будет содержать все контроллеры представлений, которые будут назначены tabBarController.
  • Создайте json файл, который предоставит мне значения вкладок. Этот шаг можно пропустить, поскольку я хотел, чтобы вкладки были динамическими на основе значения из файла JSON. Если у у вас есть статические вкладки, пропустите этот шаг.
  • В TabBarWireframe поместите цикл, который вызывает все ваши каркасы ваших вкладок.
  • В ваших индивидуальных каркасах просто создайте экземпляр viewController obj и добавьте его в массив одиночных элементов, который мы создали на шаге 3.
  • После того, как все viewController, которые являются частью вкладок, являются частью массива. Просто представьте контроллер tabBar из экземпляра loginviewcontroller (его экземпляр просто передает метод классу tabBarWireframe).

Надеюсь, я имел смысл.

Ответ 2

Другим способом реализации UITabBarController с архитектурой VIPER является предоставление TabBarInterface

import Foundation
import UIKit

protocol TabBarInterface {
    func configuredViewController() -> UIViewController
}

Чтобы каждый каркас, представляющий контроллер вида в контроллере панели вкладок, реализовал TabBarInterface, а затем installIntoWindow просто прокручивал все каркасы, вызывающие configuredViewController для каждого каркаса, который он представляет.

import Foundation

import UIKit

class TabBarWireframe : NSObject {

    let wireFrames:[TabBarInterface]
    var rootWireframe : RootWireframe?

    init(_ wireFrames:TabBarInterface...) {
        self.wireFrames = wireFrames
        super.init()
    }

    private override init() {
        self.wireFrames = [TabBarInterface]()
    }

    func installIntoWindow(window: UIWindow) {
        let tabBarController = MainTabBarController()

        var viewControllers = [UIViewController]()

        for wireFrame in wireFrames {
            viewControllers.append(wireFrame.configuredViewController())
        }

        tabBarController.viewControllers = viewControllers
        tabBarController.navigationItem.title = "Visva"

        self.rootWireframe?.installTabBarControllerIntoWindow(tabBarController: tabBarController, window: window)
    }

}

Обратите внимание, что в нашем случае RootWireframe устанавливает контроллер панели вкладок в основное окно, то есть:

window.rootViewController = tabBarController
window.makeKeyAndVisible()

Ответ 3

Я все еще новичок в VIPER, поэтому мои два цента могут не стоить многого, но, возможно, есть вкладка в качестве частной собственности на AppDelegate. Когда вам нужно перейти на конкретный индекс, есть утилиты, которые изменяют выбранный индекс на вкладке, но также запускают процесс создания каркаса/роутера.