it-swarm.com.de

UITableView beim Zurücknavigieren neu laden?

Ich habe eine oberste Ebene UIViewController, die eine UITableView enthält. Die oberste Ebene UIViewController instanziiert ein NavigationController und schiebt ein anderes UIViewController auf das NavigationController. I.E. wir drängen in eine neue, zweite Sichtweise. Diese zweite Ansicht verfügt über die übliche Schaltfläche "Zurück" in der oberen linken Ecke, mit der Sie zurück zur Ansicht der obersten Ebene navigieren können.

Ist es möglich, bei der Rückkehr von der zweiten Ansicht zur Ansicht der obersten Ebene das UITableView in der Ansicht der obersten Ebene anhand der in der zweiten Ansicht generierten Daten neu zu zeichnen, indem cellForRowAtIndexPath in der aufgerufen wird? top level und wenn ja, wie macht man das?

54
James Testa

Alles, was Sie tun müssen, ist dies (in Ihrem UIViewController, der über eine UITableView verfügt). Sie müssen sich zu diesem Zeitpunkt keine Gedanken darüber machen, was auf Zellebene geschieht.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView reloadData]; // to reload selected cell
}

Fügen Sie einfach den obigen Code zu Ihrem Controller hinzu, und Sie werden sehen, dass das Richtige passiert, wenn Sie aus Ihrer zweiten Sicht zurückkehren. Der Aufruf von reloadData teilt der Tabellenansicht mit, dass die Zellen Ihres Modells aktualisiert werden müssen, und alles andere folgt.

110
Zoran Simic

Wenn Sie nur die ausgewählte Zelle neu laden möchten, überschreiben Sie viewWillAppear: In Ihrer benutzerdefinierten Unterklasse von UITableViewController wie folgt:

- (void)viewWillAppear:(BOOL)animated
{
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];
    [super viewWillAppear:animated]; // clears selection
    if (selectedRowIndexPath) {
        [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    }
}

ANMERKUNG: Angenommen, Sie haben clearsSelectionOnViewWillAppear auf YES gesetzt (Standardeinstellung), müssen Sie den Indexpfad der ausgewählten Zeile abrufen, bevor Sie super aufrufen, wodurch die Auswahl aufgehoben wird.

Auch die Lösung von @ZoranSimic , nur [self.tablView reloadData] Aufzurufen, ist akzeptabel, da sie weniger Code enthält und dennoch effizient ist.

Schließlich können Sie die Zellen Ihrer Tabellenansicht am besten mit den von ihnen dargestellten Modellobjekten synchronisieren, indem Sie wie folgt vorgehen: NSFetchedResultsController und zum Informieren Key-Value Observing (KVO) und/oder NSNotification verwenden Der Table-View-Controller, wenn sich Modellobjekte geändert haben, sodass die entsprechenden Zellen neu geladen werden können. Der Table-View-Controller kann beginnen, Änderungen an seinen Modellobjekten in viewDidLoad zu beobachten, und endet mit dealloc (und überall dort, wo Sie manuell self.view ).

12
ma11hew28

Zusätzlich zum Antwort von Zoran Simic hier der Swift Code:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}
7
Michael Dorner

Sie können die Methoden von UINavigationControllerDelegate implementieren und die Logik für das Aktualisieren erstellen, wenn Sie Ansichtscontroller öffnen.

Eine andere Möglichkeit, dies zu tun, besteht darin, auf Ihrem Table-View-Controller eine Logik für viewWillAppear zu implementieren, die basierend auf den Daten des Popped-View-Controllers aktualisiert wird.

Wenn Sie Daten vom zweiten Ansichtscontroller zum ersten Ansichtscontroller senden müssen, denken Sie daran, dass Ihr zweiter Ansichtscontroller die Existenz des vorherigen Ansichtscontrollers nicht kennt. Es sollte dafür transparent sein. Sie sollten ein Protokoll implementieren, damit der zweite Ansichtscontroller Daten an den ersten Ansichtscontroller sendet. Dies wäre eine dritte Option für dieses Problem, da Ihr erster Ansichtscontroller der Delegierte wäre und der zweite Ansichtscontroller Informationen an den Delegierten senden würde. Sie könnten Ihre Tabellenansicht (erster Ansichtscontroller) zum erneuten Laden vorbereiten, basierend auf empfangene Daten.

5
vfn

viewWillAppear wird jedes Mal aufgerufen, wenn die Ansicht beim ersten Mal angezeigt wird. Hier ist meine Lösung zum Neuladen der Ansicht nur, wenn Sie zurück navigieren

Ich erstelle eine Variable in .h file von meinem ViewController, um zu überprüfen, ob es das erste Mal ist, dass ich zu diesem ViewController gehe, oder wenn ich zurück navigiere

@property (nonatomic) BOOL isViewExist;

Danach in viewWillAppear

-(void)viewWillAppear:(BOOL)animated{
    if(!self.isViewExist){
        self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything
    }else{
        [self.tableView reloadData]; // to reload the tableview data
        // or your can refresh anything in your ViewController as you want
    }
}

Ich hoffe das hilft

3
Phan Van Linh

Vielleicht kann jetzt helfen.

Für Swift 2 +

In Ihrer viewDidAppear-Methode:

Wenn Sie alle Tabellen neu laden möchten:

tableView.reloadData()

Wenn Sie nur die ausgewählte Zelle neu laden möchten.

let index = tableView.indexPathForSelectedRow
if (index != nil){
  self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic)
}
1
Dasoga

Aktualisiert für Swift 3

let index = tableView.indexPathForSelectedRow
    if (index != nil){
        self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic)
    }
0
Robin Thomson