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
È 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.
È possibile utilizzare un'istanza singleton, disponibile da tutte le classi, che gestirà tutte le informazioni necessarie.
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,
Grazie, suona bene. – fabian789
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.
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.
È possibile utilizzarlo come un singolo o si può conservare nel delegato app e chiamare come [AppDelegate getString];
- 1. Passa una variabile dal controller per visualizzare
- 2. Passa una variabile all'interfaccia utente JQuery
- 3. Jekyll - Passa una variabile jekyll a un tag liquido personalizzato
- 4. Passa una variabile in un partial, rails 3?
- 5. Unire un sacco di data.frames
- 6. Passa per riferimento Evita di creare una nuova variabile?
- 7. PHP che passa una variabile con reindirizzamento di intestazione
- 8. Passa una variabile dallo script di contenuto al popup
- 9. Incorporamento di UIViewcontrollers all'interno di UICollectionviewCells
- 10. passa una variabile stringa in una query gql
- 11. C# che passa un numero variabile di parametri di riferimento
- 12. Condivisione di una variabile tra processi
- 13. Push/Popping di segmenti personalizzati UIViewControllers
- 14. Passa una variabile al modello in Middleman 2
- 15. Un metodo migliore per verificare un sacco di condizioni
- 16. Passa una variabile JSP come parametro alla funzione javascript
- 17. passa a crontab una variabile e la leggi da PHP?
- 18. AngularJS passa un nome variabile di variabile come parametro di funzione
- 19. Reame che causano un sacco di ANR
- 20. Node JS Passa una variabile a Jade/Pug
- 21. Passa la variabile javascript al codice php?
- 22. PHP OOP un sacco di setter, getter
- 23. Node.js passa la variabile a route
- 24. java.lang.OutOfMemoryError anche se un sacco di
- 25. Zend Framework 2 passa variabile ai modelli
- 26. Powershell passa variabile a start-job
- 27. Laravel Blade - passa la variabile tramite un @include o @yield
- 28. Actionscript 3 ExternalInterface, Passa variabile a javascript?
- 29. un sacco di errori di lunghezza richiesta nome della variabile in Suhosin
- 30. Un sacco di incidenti in gpus_ReturnNotPermittedKillClient
Non è necessario memorizzare un puntatore all'originale MyFirstViewController per accedervi? – fabian789
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
Ok, grazie! Ho intenzione di provare questo non appena sono a casa. – fabian789