ios - item - uitabbarcontroller example swift
¿Cómo un UITabBarController encaja en la arquitectura VIPER? (3)
Estoy escribiendo una aplicación que tiene una navegación basada en TabBar. Estoy adoptando la arquitectura VIPER pero estoy realmente confundido con el tema de cómo se debe implementar un cambio de pestaña del UITabBarController.
Esto puede ser tarde, pero puede ser útil para otros. Mi caso de uso fue implementar tabBarController después de la pantalla de inicio de sesión. Puede haber muchas formas de hacerlo en VIPER, pero cómo lo hice es como sigue:
- Asignado TabBar manualmente, sin utilizar guiones gráficos.
- Cree una nueva clase de WireFrame solo para la presentación de TabBarWireframe.
- Cree una clase singleton con una matriz mutable que contendrá todos los controladores de vista que se asignarán al tabBarController.
- Cree un archivo json que me proporcione los valores de las pestañas. Este paso se puede omitir ya que quería que las pestañas fueran dinámicas basadas en el valor del archivo JSON. Si tienes pestañas estáticas, omite este paso.
- En TabBarWireframe, ponga un bucle que llame a todas las pestañas alámbricas.
- En sus wireframes individuales, solo cree una instancia del viewController obj y agréguelo a la matriz de clase singleton que creamos en el paso 3.
- Después de todo viewController, que forma parte de las pestañas, forma parte de la matriz. Simplemente presente el controlador tabBar desde la instancia de loginviewcontroller (su instancia solo pasa a través de un método a la clase tabBarWireframe).
Espero que tenga sentido.
Todavía soy nuevo en VIPER, por lo que mis dos centavos pueden no valer mucho, pero tal vez tenga la barra de pestañas como propiedad privada en el AppDelegate. Cuando necesite cambiar a un índice particular, tenga métodos de utilidad que cambien el índice seleccionado de la barra de pestañas pero que también desencadenen el proceso de creación de alámbrico / enrutador.
Otra forma de implementar UITabBarController
con la arquitectura VIPER es proporcionar un TabBarInterface
import Foundation
import UIKit
protocol TabBarInterface {
func configuredViewController() -> UIViewController
}
De modo que cada estructura alámbrica que presenta un controlador de vista en la barra de pestañas implementa TabBarInterface
y luego installIntoWindow
simplemente recorre todas las installIntoWindow
llaman configuredViewController
para cada estructura metálica que presentará.
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)
}
}
Tenga en cuenta que, en nuestro caso, RootWireframe
instala el controlador de la barra de pestañas en la ventana principal, es decir:
window.rootViewController = tabBarController
window.makeKeyAndVisible()