2013-02-24 14 views
28

Ho bisogno di passare una stringa dal delegato App al mio controller di visualizzazione iniziale, Qualcuno mi ha elencato il modo migliore per farlo, inoltre ho provato a salvare e recuperare utilizzando i valori predefiniti dell'utente NS, ma non ho funzionato correttamente.Passaggio dei dati dall'app delegato a View Controller

+0

non è per qualche ragione. Il motivo è abbastanza esplicito in quanto lo scopo del delegato dell'app è di rispondere alle modifiche nello stato dell'app. Usarlo come una discarica per dati e costanti è una cattiva forma e porta ad una dipendenza da un oggetto che non è un cittadino contribuente nel paradigma MVC. – Tyten

risposta

28

Interfaccia:

@interface MyAppDelegate : NSObject { 
    NSString *myString; 
} 
@property (nonatomic, retain) NSString *myString; 
... 
@end 

e nel file .m per l'App Delegato si può scrivere:

@implementation MyAppDelegate 
@synthesize myString; 
    myString = some string; 
@end 

Poi, nel file di viewcontroller.m è possibile recuperare:

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; 
someString = appDelegate.myString; //..to read 
appDelegate.myString = some NSString;  //..to write 
+2

Questo post mi ha appena salvato la giornata. Grazie mille amico. – Avijit

+0

La tua risposta dovrebbe contenere le lettere maiuscole: "Il mio metodo è pericoloso e cattiva pratica, perché rompe l'incapsulamento e crea uno stato globale". –

14

È possibile accedere al controller della vista radice in questo modo da e app delegato:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    MyViewController* mainController = (MyViewController*) self.window.rootViewController; 
    [mainController passData:@"hello"]; 

    return YES; 
} 
17

Qui lo è per Swift:

View Controller

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 

Inoltre, se si dispone di un oggetto che si desidera passare tra i controller di vista (ad esempio , Avevo dati CloudKit che volevo condividere) aggiungi questo al delegatario dell'app :

/* Function for any view controller to grab the instantiated CloudDataObject */ 
func getCloudData() ->CloudData{ 
    return cloudDataObject 
} 

Poi di nuovo nel View Controller

var model : CloudData = self.appDelegate.getCloudData() 
Problemi correlati