Übergeben Sie eine Variable zwischen vielen UIVIewControllern

8

In meiner iPhone App gibt es einen Setup-Assistenten, der den Benutzern hilft, viele Daten einzugeben. Es ist im Grunde ein UINavigationController mit vielen UIViewControllern darin. Jetzt möchte ich zu einem bestimmten Zeitpunkt auf eine Variable zugreifen, die der Benutzer in den ersten UIViewController eingegeben hat, den er gesehen hat. Ich könnte die Variable zwischen jedem UIViewController mit einer Setter-Methode übergeben, aber ich denke, es gibt einen einfacheren Weg.

    
fabian789 21.10.2010, 06:04
quelle

6 Antworten

7

Sie können globale oder Klassenvariablen im C-Stil deklarieren, wenn Sie möchten. Wenn Sie möchten, dass dieselbe Variable in mehreren Ihrer Unterklassen von UIViewController verfügbar ist, würden Sie sie als externe Variable in der .h-Datei Ihres ersten Controllers deklarieren, zum Beispiel:

%Vor%

Sie würden es dann in Ihrer .m-Datei ohne das extern neu deklarieren.

%Vor%

Sie sollten es nicht in den anderen .m oder .h Dateien neu deklarieren, aber Sie können auf die Variable in allen Dateien zugreifen, die MyFirstViewController.h importieren. Achten Sie beim Einstellen der Variablen darauf, dass die Variable ordnungsgemäß freigegeben und beibehalten wird. Mit dieser Art von globaler Variable ist es einfach, ein Speicherleck zu erstellen.

    
user362178 21.10.2010, 06:25
quelle
3

Eine einfache, aber wiederverwendbare und erweiterbare Möglichkeit, dieses Problem zu lösen, ist die Verwendung eines Singleton.

Deklarieren Sie eine neue Klasse mit dem Namen SetupConfig, zum Beispiel.

Ihre SetupConfig.h sollte dann wie folgt aussehen:

%Vor%

Und die entsprechende SetupConfig.m:

%Vor%

Nun möchten Sie in der View Controller-Implementierung auf myString zugreifen von:

%Vor%

Der Singleton-Ansatz bietet eine Reihe von Vorteilen gegenüber der Verwendung einer globalen C-Variablen. Zuallererst müssen Sie Ihre globalen Variablen nicht immer wieder deklarieren. Darüber hinaus sind Ihre "globalen" Variablen in einer Klasse gekapselt. Das Synthetisieren von Eigenschaften-Gettern / Settern ist eine gute Möglichkeit, die tatsächliche Variable vom Rest des Codes weg zu abstrahieren. Schließlich kann diese Implementierung problemlos in Komponententests integriert werden.

    
starbugs 01.08.2011 23:39
quelle
3

Ja, es gibt eine sehr einfache Möglichkeit, damit umzugehen .....

Sie können eine globale Variable verwenden

Deklarieren Sie in Ihrer Datei Delegate.h Ihre Variable:

%Vor%

Zweitens in der Datei Delegate.m

%Vor%

Dies ist erledigt. Nun können Sie diese String-Variable in Alle / jeder gewünschten Klasse verwenden.

Um diese globale Variable zu verwenden.

Importieren Sie nur die Datei delegieren mach den obj davon ....

%Vor%

Jetzt in deiner Klasse.m

%Vor%

Jetzt können Sie überall in Ihrer Klasse auf dieses Objekt zugreifen:

appDel.messageString

Folge einfach meinen Schritten Nachdem ich meinem Finger so viel Schmerz zugefügt habe, Ich bin mir sicher, dass dir das definitiv helfen wird.

Haben Sie ein leichtes Leben,

    
Ajay Sharma 21.10.2010 07:12
quelle
1

Sie können eine Singleton-Instanz verwenden, die von allen Ihren Klassen verfügbar ist und alle erforderlichen Informationen verarbeitet.

Singleton in Ziel-C, Wikipedia

    
Francois 21.10.2010 06:37
quelle
0

Ich würde nicht zu schnell die Datenkapselung umgehen, die eine so gute Eigenschaft von Objective-C ist.

Wenn Sie etwas sammeln, das Sie als "Einstellungen" betrachten würden, sollten Sie NSUserDefaults verwenden.

Wenn Ihre Ansichten in einer strukturierten Weise zum nächsten weitergehen, ziehen Sie in Erwägung, eine "Daten" -Klasse zu erstellen, egal, was Sie gerade machen, und übergeben Sie sie dann von der übergeordneten Ansicht zur Unteransicht, bis Sie dorthin gelangen. (Denken Sie daran, dass "Passing" keine teure Operation ist, das Zeug bleibt bestehen, Sie geben einen kleinen Zeiger)

Wenn Sie die Singleton-Route wirklich wollen, sollten Sie in Betracht ziehen, sie zu einer Eigenschaft des Anwendungsdelegaten zu machen (ein bereits existierender Singleton)

Denken Sie daran, dass nur der Weg der "Weitergabe" der Daten den zusätzlichen Vorteil bietet, dass Sie diese Ausgangsinformationen später vielleicht mehrmals sammeln und verschiedene mögliche letzte Ansichten starten möchten, und es ist trivial, einfach einen zu übergeben ein anderes. Wenn Sie die globale Route gehen, müssen Sie anfangen, überall wo Sie zuvor darauf zugegriffen haben, neu zu schreiben.

    
Alex Gosselin 01.08.2011 23:47
quelle
0
  

Sie können es als Singleton verwenden oder Sie können es im App-Delegaten behalten und anrufen       [appdelegate getstring];

    
raghul 03.01.2012 11:00
quelle