2014-12-25 8 views
11

Was sie tutDaten zwischen Tab angezeigten Controllern in Swift übergeben?

  1. Wenn die erste Seite in meiner Tab-Leiste Controller lädt, ich Daten aus einer JSON-Datei abrufen
  2. ich es in einem Array speichern (in dem ersten View-Controller)
  3. Die erhaltenen Daten werden im zweiten View-Controller angezeigt. Die Daten werden bereits geladen und in einem Array im ersten View-Controller gespeichert.

Problem:

I kann keinen Weg herauszufinden, die Daten zwischen den beiden Ansicht Controller zu übergeben. Daten können nicht basierend auf dem Segmentbezeichner übergeben werden, da es sich um einen Tab-Bar-Controller handelt.

Bitte helfen Sie!

+0

[Beispiel Verwenden eines Abwicklungssegments] (https://stackoverflow.com/a/47751962/3681880). Dies ist jedoch nur dann sinnvoll, wenn Sie vom Nachfolger einer Registerkarte zum Stamm einer anderen Registerkarte navigieren. – Suragch

Antwort

16

Sie können die Daten auf AppDelegate speichern. Es wäre einfach, von mehreren View-Controllern aus zuzugreifen. Aber wenn Sie benötigen, um die Daten zwischen dem View-Controller passieren dann:

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

Es sagt [AnyObject] Dosis kein Mitglied mit dem tiefgestellten Index – 0to1000

+0

Wo heißt es? Kannst du deinen Code posten? –

0

Ich habe einen Tabbed-View-Controller in meiner Anwendung, und ich benutze die gleiche Array für mehrere Registeransichten. Ich beende das, indem ich das Array außerhalb von Klassen (in den Zeilen zwischen dem Import von UIKit und der Klassendeklaration) deklariere, so dass es im Wesentlichen eine globale Variable ist, auf die jede Ansicht zugreifen kann. Hast du das versucht?

+0

Wie haben Sie von der anderen Klasse darauf zugegriffen? – 0to1000

+0

Ich nenne es einfach wie jede andere Variable, die bereits deklariert wurde. –

+0

Warum hat diese Antwort keinen Daumen hoch? Ist es eine schlechte Übung, weil es hier die beste/einfachste Lösung ist? – bakalolo

10

H. Serdar's Codebeispiel ist richtig, das ist der Weg, um auf den View-Controller eines anderen Tabs zuzugreifen und ihm Daten zu geben.

Beachten Sie, dass, wenn Sie ein Array in Swift, you're passing it by value übergeben, im Gegensatz zu Objective-C, die es als Referenz übergibt. Dies bedeutet, dass Änderungen, die von Ihrem zweiten Ansichts-Controller vorgenommen wurden, nicht in Ihrem ersten Ansichts-Controller angezeigt werden, da Ihr zweiter eine Kopie des Arrays und nicht das gleiche Array verwendet. Wenn Sie möchten, dass beide Ansichtscontroller dasselbe Array ändern, fügen Sie das Array in eine Klasse ein und übergeben Sie eine einzelne Instanz dieser Klasse.

einige andere Überlegungen: mit Sie die TabBarController Unterklasse könnte es eine Eigenschaft zu geben, die Ihre Daten speichern werden, und das würde auf alle Registerkarten zur Verfügung:

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

In dieser Situation würden Sie Zugriff auf das gleiche Array über mehrere Registerkarten, so dass Änderungen in einem Register an anderer Stelle widergespiegelt werden.

Ich empfehle gegen den Ansatz der Verwendung Ihrer App Delegate als zentraler Ort, um Daten zu speichern. Das ist nicht der Zweck des Delegaten der Anwendung. Sein Zweck besteht darin, Delegat-Aufrufe für das Anwendungsobjekt zu behandeln.

Ansichtssteuerungen sollten alle in ihnen eingeschlossenen Daten enthalten, damit sie ihre Arbeit erledigen können. Sie haben eine Verbindung zu ihren Modelldaten (z. B. zu Ihrem Array oder einem Verweis auf eine Datenbank oder einen verwalteten Objektkontext), anstatt einen View-Controller zu einem anderen Objekt zu bewegen, indem er ein View-Controller-Diagramm durchläuft oder in den Delegate oder gar geht Verwenden einer globalen Variablen. Mit dieser modularen, in sich geschlossenen Konstruktion von View Controllern können Sie Ihre App für ähnliche, aber einzigartige Designs auf verschiedenen Geräten umstrukturieren, z. B. einen View-Controller in einem Popover auf einem Gerät (z. B. einem iPad) präsentieren und auf einem anderen Bildschirm als Vollbild darstellen ein iPhone.

3

SWIFT 3

In Ihrem ersten Viewcontroller, erklärt Ihre Größe (in Ihrem Fall ein Array) wie gewohnt.

In Ihrem zweiten Viewcontroller, dies zu tun:

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

Das funktioniert, weil in einem TabBarController alle Viewcontrollers hinter die Registerkarte Elemente initialisiert werden. Wenn Sie dies in Ihrem zweiten Viewcontroller tun, erhalten/setzen Sie die Variable tatsächlich von/in den ersten Viewcontroller.

+0

Das sollte die richtige Antwort sein !!! –

6

Ich endete mit einem Singleton wie Woodster in seiner Antwort oben vorgeschlagen.

In Swift 3

Erstellen einer neuen schnellen Datei und erstellen Sie eine Klasse:

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

In jedem Ihrer Ansicht-Controller können Sie Ihr Array wie folgt zugreifen:

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

Nachdem diese Frage wie ein halbes Dutzend Mal diskutiert wurde - auf dem Stapel und anderswo, und mit so vielen verschiedenen Antworten auf Lösungsmöglichkeiten - ** ist dies die beste klare und prägnante Antwort/Lösung für die Frage/Anforderung ** . Dies ist eine gute, saubere Architektur, die im Einklang mit Entwurfsmustern wie Model View Presenter steht. Ich würde die Antwort fünf Mal nach oben abstimmen, wenn ich dazu in der Lage wäre, den Verkehr zu konzentrieren, wenn die Leute fragen, wie das geht. Vielen Dank für das Teilen, was mir wie die Best Practices aussieht. Aka, der richtige Weg - um diese Anforderung zu lösen – gnB

+0

Ich bin froh, dass ich helfen konnte :) Mehr Infos hier. https://krakendev.io/blog/the-right-way-to-write-a-singleton – Jeff

+0

UPDATE: Es gibt viel Kontroverse über die Verwendung eines Singleton. Beraten werden. – Jeff

Verwandte Themen