2013-02-24 10 views
28

Muszę przekazać ciąg od delegata aplikacji do mojego kontrolera widoku początkowego, Czy ktoś mi wymienił najlepszy sposób na zrobienie tego, również próbowałem zapisać i pobrać przy użyciu domyślnych ustawień użytkownika NS, ale nie działa poprawnie.Przekazywanie danych z delegata aplikacji do kontrolera widoku

+0

To nie dla jakiegoś powodu. Powód jest dość wyraźny, ponieważ celem delegata aplikacji jest reagowanie na zmiany w stanie aplikacji. Używanie go jako miejsca składowania danych i stałych jest słabą formą i prowadzi do uzależnienia od obiektu, który nie jest obywatelem uczestniczącym w paradygmacie MVC. – Tyten

Odpowiedz

28

Interfejs:

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

iw pliku .m dla App Delegata byłoby napisać:

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

Następnie w pliku viewcontroller.m można pobrać:

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

Ten wpis właśnie uratował mój dzień. Wielkie dzięki. – Avijit

+0

Twoja odpowiedź powinna zawierać pisane wielkimi literami: "Moja metoda jest niebezpieczna i zła praktyka, ponieważ przerywa enkapsulację i tworzy stan globalny." –

14

Dostęp do kontrolera widoku root można uzyskać w ten sposób e aplikacja delegat:

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

    return YES; 
} 
17

Tu jest dla Swift:

View Controller

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

Ponadto, jeśli masz obiekt, który ma przechodzić między widokiem sterowników (na przykład , Miałem dane CloudKit, które chciałem udostępnić) dodaj to do Delegata aplikacji:

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

Następnie z powrotem w View Controller

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