Ich habe zwei View-Controller, von denen einer ( ViewController
) eine Tabelle namens tableView
hat.
Ich möchte diese Tabelle von meinem anderen View-Controller ( pageView
) aktualisieren.
Ich habe das in pageView
versucht:
Aber das funktioniert nicht.
Der Verbindungsweg zwischen den beiden View-Controllern ist ein Push-Segment
Was soll ich tun? Soll ich es über ein Storyboard-Segment tun?
/ * Fügen Sie diese Zeile in der viewDidLoad-Methode in ViewController hinzu (indem Sie diese Zeile verwenden, fügen Sie der ViewController-Klasse einen Beobachter hinzu) * /
%Vor%/ * Fügen Sie diese Methode in der ViewController-Klasse hinzu (dieser Methodenaufruf, wenn Sie eine Benachrichtigung in pageView veröffentlichen) * /
%Vor%/ * füge diese Zeile hinzu, wenn / wo du deine Zeile aktualisieren möchtest (diese Zeile nach der Benachrichtigung, die in ViewController hinzugefügt wurde) * /
%Vor% Wenn ich das richtig verstanden habe, möchten Sie eine Tabellenansicht neu laden, die auf dem vorherigen View-Controller Ihres Navigationsstapels existiert. Ist dies der Fall, können Sie über die viewControllers
-Eigenschaft des Navigationscontrollers darauf zugreifen.
Meistens passiert das, weil Sie den Verweis auf Ihren zweiten Controller nicht richtig initialisieren und er bleibt null. Muss so etwas sein.
%Vor%Okay, um ein Beispiel zu nennen, rufen wir den vorherigen ViewController VC1 und den aktuellen ViewController VC2 auf.
Sie machen also einen Push-Übergang von VC1 zu VC2. Was Sie tun könnten, ist: Übergeben Sie einen Verweis der TableView auf VC2 während des Abschnitts. So würden Sie eine öffentliche UITableView-TblView-Variable in VC2 erstellen und dann in VC1 die prepareForSegue-Methode implementieren
%Vor% Dann könnten Sie in VC2 einfach [tblView reloadData];
Stellen Sie nur sicher, dass Sie die tblView-Referenz nicht verwenden, wenn Sie mit VC2 fertig sind.
Sie können die Adresse von viewcontroller.tableview und refresh.tableView überprüfen und ich denke, sie würden nicht gleich sein; Sie können Singleton für den Viewcontroller erstellen und dann zum Beispiel
aufrufen %Vor% Wenn Sie den obigen Code sehen, weisen Sie ViewController instance
nicht refresh
zu. Wenn reloadData()
ausgeführt wird, ist refresh
gleich Null, so dass es offensichtlich auf keine Aktion reagiert.
Das würde funktionieren und der wichtigste Punkt, der hier zu beachten ist, ist Ihre Aktualisierung viewcontroller
sollte die oberste Instanz im Stapel sein, da jede UI-Operation im Hauptthread stattfinden sollte.
Verwenden Sie das NSnotification-Center, fügen Sie in diesem View-Controller einen Beobachter hinzu und schreiben Sie die Methode zum erneuten Laden der Tabelle. [self.tableView reloadData]; Und von der aktuellen Ansicht post benachrichtigen Sie diesen Beobachter.
Reloaddata muss innerhalb des ParentView-Controllers ausgeführt werden, da es die TableView-Delegate-Methoden aufruft, um die Tabelle wie CellForRowAtIndexpath und viele andere neu zu laden. Das bedeutet, dass Sie im parentviewcontroller eine öffentliche Methode definieren müssen, die den Befehl reloaddata enthält, und sie über den untergeordneten Ansichtscontroller aufrufen.
public Methode:
Parentviewcontroller.h
%Vor%parentviewcontroller.m
%Vor%childviewcontroller.h
%Vor%kindviewController.m
%Vor%Ich denke, das Problem ist, dass Ihre refresh Controller-Ansicht nicht geladen ist. Die reloadTable Nachricht geht also einfach auf null. Sie können erzwingen, dass ein View Controller seine Ansicht lädt, indem er view getter aufruft:
%Vor%Überprüfen Sie also, ob Ihre tableView gleich Null ist, und wenn dies der Fall ist, initialisieren Sie sie mit der beschriebenen Methode.
Als Make-up-Antwort auf Emoticals:
Wenn Sie die Startanimation überspringen möchten, setzen Sie einfach eine bool-Eigenschaft in Ihrem ClassTwoController
, um zu überprüfen, ob diese Ansicht das erste Mal geladen wird
ClassTwoController.h:
%Vor%ClassTwoController.m:
%Vor% in deinem ClassOneController
.m initialisiere es mit dem check bool:
Wenn Sie eine Parent-Child-Beziehung haben, können Sie dem Viewcontroller so eine schwache Eigenschaft hinzufügen
%Vor% Wenn Sie die Tabelle neu laden müssen, rufen Sie einfach [parentController.tableView reloadData]
Eine andere Möglichkeit wäre die Verwendung von NSNotificationCenter. Im Controller, den Sie neu laden möchten, sollten Sie die Benachrichtigung ( [[NSNotificationCenter defaultCenter] addObserver...]
) abonnieren und den Selektor implementieren, den Sie dieser Methode zur Verfügung stellen. In einem anderen Controller sollten Sie eine Benachrichtigung mit diesem Namen veröffentlichen.
Sie können auch auf viewWillAppear aktualisieren, wenn es Ihren Anforderungen entspricht.
Tags und Links objective-c uitableview ios uiviewcontroller