2014-12-25 15 views
11

Ciò che faPassaggio rapido dei dati tra i controller visualizzati in una scheda?

  1. Quando la prima pagina nei miei scheda bar carichi di controller, ho recuperare i dati da un file JSON
  2. devo conservare in una matrice (nel primo controller della vista)
  3. I dati ottenuti verranno visualizzati nel secondo controller della vista. I dati sono già stati caricati e archiviati in un array nel primo controller della vista.

Problema:

non riesco a trovare un modo per passare i dati tra i due controller di vista. Impossibile passare i dati in base all'identificatore dei passaggi poiché è un controller barra delle linguette

Please help!

+0

[Esempio usando un unwind segue] (https://stackoverflow.com/a/47751962/3681880). Questo è utile solo se si sta navigando dalla discendente di una scheda alla radice di un'altra scheda. – Suragch

risposta

16

È possibile memorizzare i dati su AppDelegate. Sarebbe facile accedere da più controller di vista. Ma se avete bisogno per passare i dati tra i controller di vista quindi:

var secondTab = self.tabBarController?.viewControllers[1] as SecondViewController 
secondTab.array = firstArray 
+0

La dose [AnyObject] non ha un membro chiamato subscript – 0to1000

+0

Dove lo dice? Puoi pubblicare il tuo codice? –

0

Ho una visione di controllo a schede nella mia richiesta e io uso lo stesso array per più viste di tabulazione. Compendo questo dichiarando la matrice al di fuori di qualsiasi classe (nelle linee tra import Uikit e la dichiarazione di classe) in modo che sia essenzialmente una variabile globale a cui ogni vista può accedere. Hai provato questo?

+0

Come hai avuto accesso dall'altra classe? – 0to1000

+0

Lo chiamo come farei con qualsiasi altra variabile che era già stata dichiarata. –

+0

Perché questa risposta non ha il pollice in su? È una cattiva pratica perché sembra che sia la soluzione migliore/più semplice qui? – bakalolo

10

H. L'esempio di codice di Serdar è corretto, è il modo per accedere a un altro controller di visualizzazione di una scheda e dargli dati.

Ricordare che quando si passa un array in Swift, you're passing it by value, a differenza di Objective-C, che lo passa per riferimento. Ciò significa che le modifiche apportate dal secondo controller della vista non si rifletteranno sul controller della prima visualizzazione, poiché il secondo utilizza una copia dell'array, non la stessa matrice. Se vuoi che entrambi i controller di vista modifichino lo stesso array, metti l'array in una classe e passa una singola istanza di quella classe.

Alcune altre considerazioni: Si potrebbe sottoclasse il TabBarController per dargli una proprietà che ti memorizzare i dati, e che sarebbe a disposizione di tutte le schede utilizzando:

if let tbc = tabBarController as? YourCustomTabBarSubclass { 
    println("here's my data \(tbc.array)") 
} 

In tale situazione, si sarebbe accedere allo stesso array da più schede, quindi le modifiche in una scheda si rifletteranno altrove.

Si sconsiglia l'approccio dell'utilizzo del delegato dell'app come postazione centralizzata per archiviare i dati. Questo non è lo scopo del delegato dell'applicazione. Il suo scopo è gestire le chiamate delegate per l'oggetto dell'applicazione.

View I controller devono contenere tutti i dati, racchiusi in essi, di cui hanno bisogno per svolgere il loro lavoro. Hanno una connessione con i loro dati di modello (come l'array o un riferimento a un database o un contesto di oggetti gestiti) invece che un controller di visualizzazione raggiunge un altro oggetto attraversando un grafico del controller di visualizzazione o andando nel delegato o addirittura usando una variabile globale. Questa struttura modulare e autonoma di View Controller consente di ristrutturare l'app per progetti simili ma unici su dispositivi diversi, come presentare un controller di visualizzazione in un popover su un dispositivo (come un iPad) e presentarlo a schermo intero su un altro, ad esempio un iPhone.

3

SWIFT 3

Nella tua prima viewcontroller, dichiarare la variabile (nel tuo caso un array), come si farebbe normalmente.

Nel tuo secondo viewcontroller, fare questo:

var yourVariable: YourVariableClass { 
    get { 
     return (self.tabBarController!.viewControllers![0] as! FirstViewControllerClass).yourVariable 
    } 
    set { 
     (self.tabBarController!.viewControllers![0] as! FirstViewControllerClass).yourVariable = newValue 
    } 
} 

Questo funziona perché, in un tabbarcontroller tutti viewcontrollers dietro le voci della scheda vengono inizializzati. Effettuando questo nel tuo secondo viewcontroller, stai effettivamente ottenendo/impostando la variabile da/nel primo viewcontroller.

+0

Questa dovrebbe essere la risposta giusta !!! –

6

Ho finito per usare un singleton come suggeriva Woodster nella sua risposta sopra.

In Swift 3

Creare un nuovo file rapida e creare una classe:

class Items { 
    static let sharedInstance = Items() 
    var array = [String]() 
} 

In qualsiasi controller di vista è possibile accedere l'array come questo:

Items.sharedInstance.array.append("New String") 
print(Items.sharedInstance.array) 
+2

Dopo aver trovato questa domanda discussa come 1/2 dozzina di volte - in pila e altrove, e con tante risposte diverse per i modi di risolverlo - ** questa è la migliore risposta/soluzione chiara e concisa per la domanda/requisito ** . Questa è una buona architettura pulita, in linea con modelli di design come Model View Presenter. Vorrei alzare la votazione della risposta 5 volte se potessi contribuire a focalizzare il traffico quando le persone chiedono come farlo. Grazie mille per aver condiviso ciò che mi sembra come le migliori pratiche .. alias, il modo corretto - per risolvere questo requisito – gnB

+0

Sono contento di poterti aiutare :) Ulteriori informazioni qui. https://krakendev.io/blog/the-right-way-to-write-a-singleton – Jeff

+0

UPDATE: C'è molta polemica sull'uso di un singleton. Essere informati. – Jeff

Problemi correlati