0

Ich habe ein NSMutablearray, das ich in der Datei speichern möchte, wenn die Anwendung den Hintergrund eingibt. Ich habe meine NSMutableArray in meinem Viewcontroller.h als Instanz Variable deklariert:Wie greife ich auf eine View Controller-Instanzvariable von App-Delegaten zu

#import <UIKit/UIKit.h> 

NSString *docPath(); 

@interface ViewController : UIViewController<UITableViewDataSource> 

{ 
    UITableView *taskTable; 
    UITextField *taskField; 
    UIButton *insertButton; 

    NSMutableArray *tasks; 

} 

- (void)addTask:(id)sender; 


@end 

Jetzt muss ich diese Variable zugreifen in meinem AppDelegate wie so:

- (void)applicationDidEnterBackground:(UIApplication *)application { 

    [tasks writetofile:docPath() atomically:YES]; 

} 

Ich bin ziemlich neu in diesem und Selbst unterrichtet. Ich dachte, eine Art #import "Viewcontroller.h" im AppDelegate würde helfen, aber nicht sicher, wie es weitergeht. Jede Hilfe wird geschätzt.

+0

Ist-View-Controller die eine zur Zeit angezeigt? Wenn nicht, gibt es mehr als einmal gleichzeitig eine Instanz davon. – trojanfoe

+0

Ja, der View-Controller wird angezeigt und es gibt nur eine Instanz von Tasks. – Paul

+0

Sie sollten niemals auf eine Instanzvariable einer Klasse von einer anderen zugreifen. Instanzvariablen sollten immer privat sein. Eine Klasse sollte eine geeignete öffentliche Schnittstelle (Methoden und Eigenschaften) bereitstellen, auf die andere Klassen zugreifen können. – rmaddy

Antwort

1

Sie können Ihren Viewcontroller für Hintergrundbenachrichtigungen registrieren. Appdelegate ist hier nicht notwendig.

- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [tasks writetofile:docPath() atomically:YES]; 
} 

EDIT:

oder Sie können die navigation stack iterieren Ihre Viewcontroller-Instanz in AppDelegate zu bekommen.

UINavigationController *navigationController = [self.window rootViewController]; 

for (UIViewController *viewController in navigationController.viewControllers) { 
    if (viewController isKindOfClass:[YOUR_CONTROLLER class]) { 

     YOUR_CONTROLLER *yourController = (YOUR_CONTROLLER *)viewController; 

     //Do your code using yourController instance 
    } 
} 

HINWEIS: Der obige Code auf der Annahme basiert, dass Ihr RootViewController ist UINavigationController

+0

Ok danke das ist sehr hilfreich. Aber ich bin neugierig. Wie würde ich eine Instanzvariable von ViewController in AppDelegate importieren? – Paul

+0

Um nur darauf hinzuweisen, ist die erste Hälfte dieser Antwort der richtige Weg, um das eigentliche Problem zu lösen, das das OP lösen muss, aber nichts über diese Antwort liefert tatsächlich Informationen über die spezifische Lösung, die in der Frage gefragt wird. Aber das OP versucht die falsche Lösung. Der App-Delegierte sollte in keiner Weise an der Speicherung der Daten beteiligt sein. Und es ist eine wirklich schlechte Idee für jede Klasse zu versuchen, auf die Instanzvariablen einer anderen Klasse zuzugreifen. – rmaddy

+1

Beachten Sie, dass die erste Hälfte dieser Antwort nur halb abgeschlossen ist. Stellen Sie sicher, dass die Klasse 'removeObserver' in ihrer' dealloc' Methode aufruft. – rmaddy

Verwandte Themen