2016-11-23 2 views
3

Jetzt habe ich 3 Viewcontrollers wie folgt aus:Beim Wechseln von einer Viewcontroller auf einen anderen Viewcontroller und Aktualisierung

HomeViewcontroller = VC1. 
Viewcontroller2 = VC2 --> has a table view with cells on it. 
Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete. 

ich NavigationController zwischen Viewcontrollers, bin mit dem schönen Taste, um „zurück“ :)

Lassen Sie uns sagen Ich bin in VC1, ich drücke einen Knopf und ich gehe zu VC2. Jetzt sagen wir, ich habe 4 Zellen. Ich drücke Zelle Nummer 2 und ich gehe zu VC3, wo ich bearbeiten kann, was ich in der Zelle habe oder es sogar löschen. Das funktioniert alles OK (getestet).

Sagen wir, ich möchte diese Zelle löschen. Ich habe eine Taste auf VC3 und ich benutze sie und ich lösche die Zelle (das ist getestet und funktioniert auch OK). Jetzt

, wenn ich dies tun schiebe ich in VC2 wieder wie folgt aus:

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2! 
self.navigationController?.pushViewController(viewController!, animated: true) 

Das Problem ist, dass, wenn ich das tue ich VC2 gehen, aber ich nicht nachladen meine Tableview hat es sollte (die gelöscht Zelle ist es immer noch da).

Um dies zu beheben, habe ich versucht, einige Code in VC2 das Hinzufügen, in der viewDidLoad:

self.tableView.reloadData() 

Jetzt habe ich es geschafft, es Arbeit zu tun. Ich meine, wenn ich eine Zelle von VC3 lösche, werde ich zu VC2 geschoben und die Zelle ist nicht da. Wenn ich jedoch die Zurück-Taste drücke, bringt es mich zur vorherigen Zelle, die ich gelöscht habe. Wenn die Zelle nicht mehr existiert, will ich nicht, dass sie mich dorthin bringt. Ich will, dass es mich zum VC1 (zuhause) bringt.

Wie kann ich das schaffen?

Vielleicht sollte ich das anders machen und nicht so drängen?

Antwort

2

Praktisch tun Sie falsch, wenn Lösch-/Bearbeitungsvorgang auf VC3 getan und Sie wollen wieder auf VC2 kommen, warum Sie pushViewController tun, müssen Sie popViewController anwenden.

Sie müssen anwenden, VC3 von VC3 zurückkommen. Entfernen

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2! 
self.navigationController?.pushViewController(viewController!, animated: true) 

hinzufügen

self.navigationController?.popViewController(animated: true) 

Auch

in viewWillAppearreloadData() Methode zur Tabellenansicht Put. wie unter dem Code.

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    self.tableView.reloadData() 

} 

Einige Referenzmaterial über UINavigationController zu lesen.

https://developer.apple.com/reference/uikit/uinavigationcontroller

+0

Das gleiche wie meine Antwort. – vacawama

+0

Versucht, dass. Du hast Recht. Das ist es. Danke vielmals. Ich werde es überprüfen und lesen Sie sicher –

+0

Großartig, halten Sie sich glücklich Codierung. – Hasya

2

Setzen Sie Ihre self.tableView.reloadData() in einen Override von viewWillAppear. viewDidLoad wird nur einmal nach dem Erstellen des ViewControllers aufgerufen, aber viewWillAppear wird jedes Mal aufgerufen, wenn es auf dem Bildschirm erscheint.

Verwenden Sie auch keinen Druck, um von VC3 zu VC2 zurückzukehren. Sie sollten den aktuellen viewController öffnen.

self.navigationController?.popViewController(animated: true) 
+0

Gute Antwort. So wie meine Antwort. +1 Bro. Yer sehr gute Beobachtung von 'popViewController'. – Hasya

+0

Versuchte das. Du hast Recht. Das ist es. Vielen Dank –

1

Statt ViewController2 wieder drängen von ViewController3 Sie benötigen einen Delegierten erstellen und diesen Delegaten implementieren in Ihrer ViewController2 nun die Instanz des Delegaten in viewController3 erstellen und diesen Delegaten festgelegt, wenn Sie von ViewController2 bewegen zu ViewController3. Wenn Sie nun Daten von ViewController2 aktualisieren oder löschen, verwenden Sie einfach diesen Delegaten, um die Methode ViewController2 aufzurufen. Aktualisieren Sie innerhalb dieser Methode Ihre DataSource und laden Sie die tableView neu.

+0

Das ist es danke :) –

1

N.,

Normalerweise, wenn andere Ansicht-Controller in einer Navigationssteuerung eingebettet sind, drücken Sie den Stapel auf und gehen zurück Sie aus dem Stapel Pop. Wie ich Ihre Geschichte verstehe, scheint es, dass Sie nur neue View-Controller auf den Stapel schieben.

Ihr erster View-Controller ist VC1. Sie drücken eine Taste und Sie schieben den neuen View-Controller auf den Stack, VC2. Der Navigationscontroller verfügt nun über zwei View-Controller auf dem Stack VC1 und VC2. Dann wählen Sie eine Zelle in der Tabellenansicht von VC2 und Sie gelangen zu VC3.

Der Navigationscontroller enthält jetzt drei View-Controller auf dem Stack VC1, VC2 und VC3. Jetzt löscht man eine Zelle und drückt einen NEUEN View-Controller auf den Stack, der wiederum ein VC2, aber ein neuer ist. Der Navigationscontroller hat nun vier View-Controller auf dem Stack VC1, VC2, VC3 und eine weitere Instanz von VC2.

Ich würde annehmen, dass Sie ein Modellobjekt haben, das die Daten in den Tabellenansichten von VC2 und VC3 enthält. Wenn Sie die Zelle löschen, sollten Sie die Zelle in Ihrem Modellobjekt löschen und nicht ein neues VC2 auf dem Stapel verschieben, aber das VC3 ablehnen. Sie können dies mit einer @IBAction in VC2 tun, mit der Ihre Schaltfläche zum Löschen verbunden ist. Dann wird der VC3 vom Stapel entfernt und Sie landen in VC2 in der IBAction-Methode, mit der Sie die Schaltfläche zum Löschen verknüpft haben. Der Navigationscontroller hat dann nur noch zwei View-Controller auf dem Stack, VC1 und VC2.

In dieser IBAction Methode können Sie die Tabellenansicht und die Tabellenansicht rufen die Datenquelle Methode

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

Diese Methode bei Ihrem Modell-Objekt aussehen wird neu geladen und nicht gefunden wird, um die gelöschten Daten und Ihre Zelle verschwunden.

Wenn Sie dann den Zurück-Knopf drücken, schiebt der Navigationscontroller den VC2 vom Stapel und verbleibt mit nur einem Ansichtscontroller VC1. Sie landen wieder auf Ihrer Seite.

Hoffe, das hilft.

+0

Danke für die Erklärung zu mir. Ich kann sehen, was falsch war. Noch einmal Danke –

Verwandte Themen