Я пишу приложение с навигацией на основе TabBar. Я принимаю архитектуру VIPER, но меня действительно смущает тема того, как должно быть реализовано изменение вкладки UITabBarController.
Как UITabBarController вписывается в архитектуру VIPER?
Ответы (3)
Это может быть поздно, но это может быть полезно для других. Мой вариант использования заключался в реализации tabBarController после экрана входа в систему. В VIPER это можно сделать разными способами, но я сделал это следующим образом:
- Выделил TabBar вручную, без использования раскадровки.
- Создайте новый класс WireFrame только для представления TabBarWireframe.
- Создайте одноэлементный класс с одним изменяемым массивом, который будет содержать все контроллеры представления, которые будут назначены tabBarController.
- Создайте файл json, который предоставит мне значения вкладок. Этот шаг можно пропустить, так как я хотел, чтобы вкладки были динамическими на основе значения из файла JSON. Если у вас есть статические вкладки, пропустите этот шаг.
- В TabBarWireframe поместите цикл, который вызовет каркасы всех ваших вкладок.
- В ваших отдельных каркасах просто создайте экземпляр объекта viewController и добавьте его в массив одноэлементных классов, который мы создали на шаге 3.
- Ведь viewController, которые являются частью вкладок, являются частью массива. Просто представьте контроллер tabBar из экземпляра loginviewcontroller (его экземпляр просто проходит через метод в класс tabBarWireframe).
Надеюсь, я имел смысл.
Еще один способ реализовать 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()
Я все еще новичок в VIPER, поэтому мои два цента могут не стоить многого, но, возможно, панель вкладок является частной собственностью в AppDelegate. Когда вам нужно перейти на определенный индекс, используйте служебные методы, которые изменяют выбранный индекс на панели вкладок, но также запускают процесс создания каркаса/маршрутизатора.