Как 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. Когда вам нужно перейти на конкретный индекс, есть утилиты, которые изменяют выбранный индекс на вкладке, но также запускают процесс создания каркаса/роутера.