Sto scrivendo un'applicazione che ha una navigazione basata su TabBar. Sto adottando l'architettura VIPER ma sono davvero confuso dall'argomento su come dovrebbe essere implementato un tab di UITabBarController.Come un UITabBarController si adatta all'architettura VIPER?
risposta
Potrebbe essere tardi, ma potrebbe essere utile per gli altri. Il mio caso d'uso era di implementare tabBarController dopo la schermata di login. Ci possono essere molti modi in cui possiamo farlo in VIPER, ma come ho fatto è la seguente:
- Assegnati TabBar manualmente, senza l'utilizzo di storyboard.
- Creare una nuova classe WireFrame solo per la presentazione TabBarWireframe.
- Creare una classe singleton con una matrice mutabile che conterrà tutti i controller di visualizzazione da assegnare a tabBarController.
- Creare un file json che fornirà i valori delle schede. Questo passaggio può essere saltato poiché volevo che le schede fossero dinamiche in base al valore del file JSON. Se hai schede statiche, salta questo passaggio.
- In TabBarWireframe, inserire un ciclo che chiama tutti i wireframe delle schede.
- Nei tuoi individuali wireframe solo un'istanza viewController obj e aggiungerlo alla matrice di classe singleton che abbiamo creato nel passaggio 3.
- Dopo tutto viewController che fanno parte delle schede sono parte della matrice. Basta presentare il controller TabBar dall'istanza loginviewcontroller (la sua istanza passa semplicemente attraverso un metodo alla classe tabBarWireframe).
Spero di avere un senso.
Sono ancora nuovo su VIPER, quindi i miei due centesimi potrebbero non valere molto, ma forse la tabbar è una proprietà privata su AppDelegate. Quando è necessario passare a un indice particolare, sono disponibili metodi di utilità che modificano l'indice selezionato nella barra delle linguette ma attivano anche il processo di creazione wireframe/router.
Un altro modo per attuare UITabBarController
con architettura VIPER è quello di realizzare un TabBarInterface
import Foundation
import UIKit
protocol TabBarInterface {
func configuredViewController() -> UIViewController
}
modo che ogni wireframe che presenta un controller di vista nel controllore scheda bar implementa TabBarInterface
e poi installIntoWindow
solo ciclo in tutti i wireframe chiamante configuredViewController
per ogni wireframe che presenterà.
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)
}
}
prega di notare che nel nostro caso RootWireframe
installa il controller barra delle schede nella finestra principale, vale a dire:
window.rootViewController = tabBarController
window.makeKeyAndVisible()
Questo è anche un buon approccio –
Posso ottenere questo come esempio di modello di codice su Github o qualcosa del genere? – HeiN
Ho fatto quasi lo stesso, ma più 1 per la spiegazione –
ohh ... grande per sentire :) – Maddiee
ma come sta seguendo viper? anche nel mio caso ho bisogno di fare qualche chiamata di rete sul livello rootviewcontroller che deve anche ospitare tabbar –