2017-07-19 35 views
0

Ich habe überall nach diesem Problem gesucht und ich kann keine Antwort finden.abwickeln segue, muss tableview aktualisieren

Also auf der ersten Seite meiner App habe ich eine Seite in einem Navigationscontroller. Auf dieser Seite befindet sich eine Tabellenansicht. Innerhalb der Zellen der Tabelle befindet sich eine Schaltfläche. Für den View-Controller der Zellen, sage ich, entfernen Sie die Schaltfläche aus Superview, wenn Benutzer nicht angemeldet ist. Also, wenn Sie die App zum ersten Mal laden, gibt es keine Schaltfläche.

Wenn Sie jetzt auf die Schaltfläche zum Anmelden (eine Schaltfläche oben auf der Seite) klicken, wird diese Seite angezeigt. Dann gibt es zwei mögliche Dinge, die passieren können. Zuerst machte ich einen Rückweg zur Hauptseite. Alles hat perfekt funktioniert. Die Schaltfläche wird in den Zellen angezeigt.

Aber ich mag es nicht, wie eine zweite Kopie der Hauptseite zum Stapel der Navigationscontroller hinzugefügt wird. Also, was ich jetzt erforscht habe, ist die popnavigationcontroller-Methode und die Abwicklungssequenz. Also beide funktionieren, aber das Problem ist, wenn es zurück auf die neue Seite abwickelt, erscheint die Schaltfläche, die ich zuvor erwähnte nicht in den Zellen, obwohl es angezeigt werden soll, seit der Benutzer angemeldet ist. Der Grund dafür ist, weil die Methode "dequeueReusuableCell" verwendet die alten Zellen, in denen ich die Schaltfläche entfernt habe. Und jetzt, da die Schaltfläche entfernt wurde, gibt es keine einfache Möglichkeit, sie an der richtigen Stelle in der Ansicht wieder hinzuzufügen.

Was ist die beste Lösung hier? Zuerst suchte ich nach einer Möglichkeit, alle wiederverwendbaren Zellen für einen TableView zu "löschen", aber ich bin mir nicht sicher, ob ich eine Antwort gefunden habe. Was ich tun möchte, ist, wenn ich zurück zu diesem Navigationscontroller zurückspulen, alles auffrischen, wie es das erste Mal war, das es überhaupt sah.

Ich denke, eine andere Lösung, die ich tun könnte, besteht darin, einen normalen Übergang von der Anmeldeseite zur Hauptseite durchzuführen und dann den vorherigen redundanten Hauptnavigationscontroller zu entfernen. Gibt es eine bessere Lösung?

+0

Entfernen Sie nicht die Schaltfläche aus den Zellen, legen Sie einfach "button.isHidden = true", und wenn Sie aktualisieren, können Sie den Wert isHidden in false ändern –

+0

wow, das funktioniert lol. Verdammt, ich habe diese Funktion schon vorher gesehen, aber ganz vergessen. Ich danke dir sehr. –

Antwort

1

Wenn Ihr Controller aus dem Stapel springt, wird der zugrunde liegende View-Controller seine viewDidAppear(animated:)-Funktion aufgerufen. So könnten Sie haben:

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    tableView.reloadData() 
} 

Dies wird auf Ihrem Beitrag basiert davon aus, dass das Problem ist nur über den Tisch neu zu laden. Wenn Sie die Tabelle erneut laden und Ihre Zellen immer noch nicht ordnungsgemäß aktualisiert werden, liegt ein Problem vor, dass Ihre Zellen nicht richtig konfiguriert sind. Aber ich kann nicht sagen, ob dies ohne Code der Fall ist.

Edit: Dies war ein Problem der Wiederverwendung von Zellen. Die Zellenkonfiguration enthielt in einigen Fällen Code zum Entfernen einer Teilansicht, aber nie die Teilansicht zurück, wenn sie vorhanden sein sollte. Die einfachste Lösung besteht darin, isHidden zu verwenden, anstatt die Teilansicht direkt zu entfernen.

+0

Ich habe es auch versucht, nur vergessen, es zu erwähnen. Ich habe getestet, ob die Zellen ordnungsgemäß aktualisiert werden, indem Sie Druckanweisungen überall platzieren, aber das Problem ist, dass es die Zelle REUSING ist, in der ich die Schaltfläche bereits entfernt habe. Ich möchte die Schaltfläche nicht zur Ansicht hinzufügen müssen, weil ich nicht weiß, wie man automatisches Layout und dergleichen im Code macht. Ich habe die Schaltfläche bereits standardmäßig im Storyboard hinzugefügt. Ist das sinnvoll? Wenn ich einen normalen Übergang mache, funktioniert alles richtig, weil der Knopf nicht entfernt wird. Die Schaltfläche ist standardmäßig vorhanden, wenn die Zellen zum ersten Mal geladen werden. –

+0

Anstatt die Schaltfläche zu entfernen, versuchen Sie, 'isHidden' auf' true' oder 'false' auf der Schaltfläche zu setzen, je nachdem, ob Sie sie dort haben möchten. Sie haben normalerweise eine Art Funktion, um Ihre Zellen innerhalb von 'cellForRowAtIndexPath' zu konfigurieren, ja? Da Zellen wiederverwendet werden, müssen Sie immer mit beiden Seiten jeder Zellmanipulation umgehen, die Sie gerade machen. Subviews hinzufügen/entfernen, sie ein-/ausblenden, eine Schriftart ändern/ändern, und so weiter. – Connor

+0

Ja, du hast recht, ich hätte isHidden benutzen sollen. Ich habe es gerade ausprobiert und alles funktioniert perfekt. Vielen Dank! Ich weiß nicht, ob es wichtig ist, aber wenn Sie Ihre Antwort in einen anderen Thread ihrer eigenen setzen, werde ich es richtig markieren –