2010-09-19 16 views
53

Ich habe eine Top-Level UIViewController, die eine UITableView enthält. Die oberste Ebene UIViewController instanziiert eine NavigationController und schiebt eine weitere UIViewController auf die NavigationController. I.E. wir drängen in eine neue, zweite Sichtweise. Diese zweite Ansicht hat die übliche Schaltfläche "Zurück" in der oberen linken Ecke, mit der Sie zurück zur Ansicht der obersten Ebene navigieren können.UITableView neu laden, wenn Sie zurück navigieren?

Ist es möglich, bei der Rückkehr zur Top-Level-Ansicht aus der zweiten Ansicht das UITableView in der Top-Level-Ansicht neu zu zeichnen, indem die in der zweiten Ansicht generierten Daten verwendet werden, indem cellForRowAtIndexPath in der obersten Ebene aufgerufen wird. Wie macht man das?

Antwort

105

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

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

Fügen Sie einfach den Code oben auf dem Controller, und Sie werden sehen, dass das Richtige passiert, wenn Sie wieder von Ihrem zweiten Blick kommen. Der Aufruf an reloadData teilt der Tabellenansicht mit, dass sie ihre Zellen von Ihrem Modell aktualisieren muss, und alles andere folgt gut.

+1

ich diese Methode verwendet, hatte aber den Code von meinem didViewLoad zu viewWillAppear zu bewegen, wie sie beide Brennen auf Vorlast wo. Für mich war es ein größeres Problem, weil ich die neuen Artikeldetails von einem Webservice herunterladen muss. – PowerMan2015

5

Sie können die Methoden von UINavigationControllerDelegate implementieren und die Logik für die Aktualisierung beim Öffnen von View-Controllern erstellen.

Eine andere Möglichkeit, dies zu tun, würde auf Ihrem Tabellenansicht Controller einige Logik auf viewWillAppear implementieren, um basierend auf den Daten des Popup-View-Controller zu aktualisieren.

Wenn Sie Daten vom zweiten View-Controller an den ersten View-Controller senden müssen, denken Sie daran, dass Ihr zweiter View-Controller das Vorhandensein des vorherigen View-Controllers nicht kennt. Es sollte für sie transparent sein. Sie sollten ein Protokoll implementieren, damit der zweite View-Controller Daten an den ersten View-Controller sendet. Es wäre eine dritte Option für dieses Problem, da Ihr erster View-Controller der Delegate wäre und der zweite View-Controller Informationen an den Delegaten senden würde. Sie könnten Ihre Tabellenansicht (den ersten View-Controller) zum erneuten Laden vorbereiten, basierend auf dem empfangene Daten.

10

Wenn Sie nur die Zelle neu geladen werden soll, die ausgewählt wurde, außer Kraft setzen viewWillAppear: in Ihrer benutzerdefinierten Unterklasse von UITableViewController wie so:

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

HINWEIS: Angenommen, Sie haben links clearsSelectionOnViewWillAppear Satz YES (Standardeinstellung), Sie müssen den Indexpfad der ausgewählten Zeile abrufen, bevor Sie super aufrufen, wodurch die Auswahl gelöscht wird.

Auch die solution of @ZoranSimic zu rufen Sie einfach [self.tablView reloadData] ist akzeptabel, da es weniger Code und immer noch effizient ist.

Schließlich ist der beste Weg, die Tabellenansichtszellen mit den von ihnen repräsentierten Modellobjekten synchron zu halten, wie NSFetchedResultsController und verwenden Sie die Schlüsselwertbeobachtung (KVO) und/oder NSNotification, um Ihren Tabellensichtcontroller beim Modell zu informieren Objekte haben sich geändert, so dass sie die entsprechenden Zellen neu laden können. Der Tabellenansicht-Controller könnte mit der Beobachtung von Änderungen an seinen Modellobjekten in viewDidLoad beginnen und die Beobachtung in dealloc (und an jedem anderen Ort manually unload self.view) beenden.

6

Neben dem answer of Zoran Simic hier der Swift Code:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    tableView.reloadData() 
} 
+0

Achten Sie darauf, keine Daten von 'viewDidLoad()' zu erhalten, wenn Sie Daten von 'viewWillAppear()' neu laden wollen. –

1

Vielleicht kann jetzt helfen.

Für Swift 2+

In Ihrer viewDidAppear Methode:

Wenn Sie alle Tabelle neu geladen werden sollen:

tableView.reloadData() 

Wenn Sie nur die Zelle ausgewählt neu geladen werden sollen.

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

viewWillAppear wird jedes Mal, wenn der Blick erscheint umfasst das erste Mal aufgerufen. Hier ist meine Lösung für die Ansicht neu laden nur, wenn Sie navigieren zurück

ich eine Variable in .h file meiner ViewController schaffen für die Überprüfung, dass es das erste Mal, dass ich auf diese ViewController gehen oder, wenn ich zurück navigieren

@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 
    } 
} 

Hope this Hilfe

-1

Aktualisiert für Swift 3

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

_in - override func viewDidLoad() oder ??? _ - kommentieren im Namen des Benutzers, der nicht kommentieren kann – Tushar

Verwandte Themen