2009-07-13 12 views
1

Ich habe ein Problem in meiner Anwendung. Jede Hilfe wird sehr geschätzt. Grundsätzlich ist es von Sicht A zu Sicht B, und dann zurück von Ansicht B.Laden Sie Daten aus der Tabellenansicht neu, nachdem Sie aus einer anderen Ansicht zurückgekehrt sind.

In der Ansicht A, hat es dynamische Daten aus der Datenbank geladen und in der Tabellenansicht angezeigt. Auf dieser Seite hat es auch die Bearbeitungsschaltfläche, nicht auf der Navigationsleiste. Wenn der Benutzer die Bearbeitungsschaltfläche öffnet, wird die Ansicht B angezeigt, in der die Auswahlansicht angezeigt wird. Und der Benutzer kann hier Änderungen vornehmen. Sobald dies getan ist, Tabs Benutzer die Schaltfläche zurück auf der Navigationsleiste, speichert die Änderungen in die NSUserDefaults, geht zurück in die Ansicht A durch Pop in der Ansicht B.

Wenn zurück zur Ansicht A, sollte es erhalten die neuen Daten von den UIUserDefaults, und es tat. Ich benutzte NSLog, um auf die Konsole auszudrucken, und es zeigt die korrekten Daten an. Außerdem sollte die ViewWillAppear: -Methode aufgerufen werden, um die neuen Daten für die Tabellenansicht abzurufen, dies jedoch nicht. Es hat sogar die tabellarische Ansicht: numberOfRowsInSection: method nicht aufgerufen. Ich habe eine NSLog-Anweisung in diese Methode eingefügt, aber nicht in der Konsole ausgedruckt.

Als Ergebnis enthält die Ansicht A noch die alten Daten. Die einzige Möglichkeit, die neuen Daten in der Ansicht A zu erhalten, besteht darin, die Anwendung zu stoppen und zu starten.

Sowohl Ansicht A als auch Ansicht B sind die Unterklasse von UIViewController, mit UITableViewDelegate und UITableViewDataSource.

Hier mein Code in der Ansicht A:

- (void)viewWillAppear:(BOOL)animated { 
    NSLog(@"enter in Schedule2ViewController ..."); 

    // load in data from database, and store into NSArray object 

    //[self.theTableView reloadData]; 
    [self.theTableView setNeedsDisplay]; 
    //[self.theTableView setNeedsLayout]; 
} 

In hier die "theTableView" ist ein UITableView Variable. Und ich versuche alle drei Fälle von "reloadData", "setNeedsDisplay" und "setNeedsLayout", aber schien nicht zu funktionieren.

In der Ansicht B ist hier die Methode, die der Zurück-Schaltfläche in der Navigationsleiste entspricht.

- (void)viewDidLoad { 
    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(savePreference)]; 
    self.navigationItem.leftBarButtonItem = saveButton; 
    [saveButton release]; 
} 

- (IBAction) savePreference { 
    NSLog(@"save preference."); 

    // save data into the NSUSerDefaults 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

Bin ich in der richtigen Weise? Oder gibt es etwas, das ich vermisst habe?

Antwort

3

Wenn eine Ansicht zuerst geladen wird, ruft sie die viewDidLoad-Methode auf. Wenn Sie einen Stapel erstellen, einen Drilldown ausführen (von A nach B) und dann zurückgeben (B nach A), wird die viewDidLoad nicht erneut in A aufgerufen. Sie können versuchen, A in B zu übergeben (indem Sie self übergeben)) und rufen Sie die viewDidLoad-Methode auf, um die neuen Daten abzurufen, und rufen Sie dann die reloadData-Methode in der tableView auf, um die Tabellenansicht aufzufüllen.

Was Sie vielleicht ausprobieren möchten, ist, die Funktionalität zum Abrufen und Einstellen von Daten aus der viewDidLoad-Methode herauszunehmen und sie in ihre eigene getData-Methode einzufügen. Am Ende der Methode getData können Sie [self.tableView reloadData]; platzieren, um die Tabellenansicht zurückzusetzen/neu zu füllen. Von Klasse B aus könnten Sie [self getData] aufrufen und den Arbeitsaufwand in Klasse B minimieren. Dies würde die Wiederverwendbarkeit dieses Codes verbessern und möglicherweise verhindern, dass Nebenwirkungen die viewDidLoad-Methode aufrufen.

1

Sie können auch viewDidAppear verwenden. Es wird jedes Mal aufgerufen, wenn der Bildschirm erscheint. Setzen Sie aus Performance-Gründen ein Flag, damit Sie in viewDidLoad mit viewDidAppear nicht die gleiche Funktionalität für die erste Bildschirmdarstellung wiederholen.