8

Nella mia app per iPhone, c'è un assistente di configurazione che aiuta gli utenti a inserire molti dati. È fondamentalmente un UINavigationController con un sacco di UIViewControllers in esso. Ora, ad un certo punto, voglio accedere a una variabile che l'utente ha inserito nel primo UIViewController che ha visto. Potrei passare la variabile tra ogni UIViewController con un metodo setter, ma immagino che ci sia un modo più semplice.Passa una variabile tra un sacco di UIVIewControllers

risposta

7

È possibile dichiarare variabili globali o di classe in stile C se si desidera. Se si desidera che la stessa variabile per essere disponibile in molte delle vostre classi secondarie di UIViewController, devi dichiararlo come variabile extern nel file h del primo controller, ad esempio:

#import <UIKit/UIKit.h> 

extern NSString *myGlobalString; 

@interface MyFirstViewController : UIViewController { 
... 

Faresti quindi ridichiarlo nel tuo file .m senza l'extern.

#import "MyFirstViewController.h" 

NSString *myGlobalString; 

@implementation MyFirstViewController 

Non si dovrebbe ridichiarare nell'altra .m o file .h, ma è possibile accedere alla variabile in tutti i file che importano MyFirstViewController.h. Quando si imposta la variabile, fare attenzione a rilasciarla e conservarla correttamente. È facile creare una perdita di memoria con questo tipo di variabile globale.

+0

Non è necessario memorizzare un puntatore all'originale MyFirstViewController per accedervi? – fabian789

+0

No, non è necessario memorizzare alcun puntatore agli oggetti per accedere a questo tipo di variabile, ma si ottiene solo un'istanza di questo ed è condivisa tra tutti gli oggetti. – user362178

+0

Ok, grazie! Ho intenzione di provare questo non appena sono a casa. – fabian789

3

Ya, c'è molto di un modo semplice per gestire questo .....

si può prendere una variabile globale

Nel file Delegate.h dichiarare la variabile:

@interface Smoke_ApplicationAppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UINavigationController *navigationController; 
    NSString *messageString; //This would be your String Variable 

} 

@property(nonatomic,retain)NSString *messageString; 

in secondo luogo in Delegate.m presentare

@implementation Smoke_ApplicationAppDelegate 

@synthesize window; 
@synthesize navigationController; 
@synthesize messageString; // Synthesize it over here.. 

questo è fatto .Ora è possibile utilizzare questo String Variabile in All/qualsiasi classe che vuoi ..

Per utilizzare questa variabile globale.

Basta importare si delega il file fare l'obj di esso ....

#import "DelegateFile.h" 

@implementation About 

DelegateFile *appDel; 

ora nel tuo class.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    appDel=[[UIApplication sharedApplication]delegate]; 

} 

Ora è possibile accedere ovunque nella classe da questa oggetto:

appDel.messageString

Basta seguire i miei passi con attenzione Dopo aver dato tanto dolore al mio dito, Sono sicuro che questo è sicuramente andare per aiutarvi a .....

Avere una vita facile,

+0

Grazie, suona bene. – fabian789

3

un semplice ma riutilizzabile ed estensibile per risolvere questo problema sta usando un singleton.

Dichiarare una nuova classe denominata SetupConfig, ad esempio.

tuo SetupConfig.h dovrebbe quindi apparire come segue:

@interface SetupConfig : NSObject { 
    NSString *_myString; 
} 

@property (retain) NSString *myString; 

+ (id)sharedSetupConfig; 

@end 

e il corrispondente SetupConfig.m:

#import "SetupConfig.h" 

SetupConfig *g_sharedSetupConfig = nil; 

@implementation SetupConfig 

@synthesize myString = _myString; 

+ (id)sharedSetupConfig { 
    if (!g_sharedSetupConfig) { 
     g_sharedSetupConfig = [[SetupConfig alloc] init]; 
    } 
} 

@end 

Ora, nella realizzazione View Controller si desidera accedere myString da:

@import "MyViewController.h" 
@import "SetupConfig.h" 

@implementation MyViewController 

- (void)methodDoingSomethingWithSingletonString 
{ 
    NSString *myString = [[SetupConfig sharedSetupConfig] myString]; 
} 

@end 

L'approccio singleton presenta numerosi vantaggi rispetto all'utilizzo ng una variabile C globale. Prima di tutto non devi ri-dichiarare le tue variabili globali più e più volte. Per di più, le tue variabili "globali" sono incapsulate in una classe. Sintetizzare i getter/setter di proprietà è un buon modo per astrarre la variabile attuale dal resto del codice. Infine, questa implementazione può essere facilmente integrata nei test unitari.

0

Non vorrei essere troppo veloce per eludere l'incapsulamento dei dati che è una caratteristica così buona di Objective-C.

Se stai raccogliendo qualcosa che consideri "Impostazioni", considera l'utilizzo di NSUserDefaults.

Se le tue visualizzazioni procedono in un modo strutturato al successivo, considera la possibilità di creare una classe "dati", qualunque cosa tu stia facendo, quindi passarla dalla visualizzazione genitore alla sottoview fino a quando non ci arrivi. (Ricorda che "passare" non è un'operazione costosa, le cose rimangono, stai passando un piccolo puntatore)

Se vuoi davvero il percorso di singleton, considera di renderlo una proprietà del delegato dell'applicazione (già esistente singleton)

Ricorda che solo il percorso di "passaggio" dei dati offre l'ulteriore vantaggio che in seguito, forse vorrai raccogliere più volte quell'informazione di partenza, e lanciare diverse possibili last-view, ed è banale solo passare in uno diverso. Se segui la rotta globale, dovrai iniziare a riscrivere ovunque ti sia già accesso.

0

È possibile utilizzarlo come un singolo o si può conservare nel delegato app e chiamare come [AppDelegate getString];

Problemi correlati