2015-05-13 20 views

risposta

16

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:

  1. Assegnati TabBar manualmente, senza l'utilizzo di storyboard.
  2. Creare una nuova classe WireFrame solo per la presentazione TabBarWireframe.
  3. Creare una classe singleton con una matrice mutabile che conterrà tutti i controller di visualizzazione da assegnare a tabBarController.
  4. 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.
  5. In TabBarWireframe, inserire un ciclo che chiama tutti i wireframe delle schede.
  6. Nei tuoi individuali wireframe solo un'istanza viewController obj e aggiungerlo alla matrice di classe singleton che abbiamo creato nel passaggio 3.
  7. 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.

+0

Ho fatto quasi lo stesso, ma più 1 per la spiegazione –

+0

ohh ... grande per sentire :) – Maddiee

+0

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 –

2

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.

5

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() 
+0

Questo è anche un buon approccio –

+0

Posso ottenere questo come esempio di modello di codice su Github o qualcosa del genere? – HeiN