Wie lade ich Daten in UITableView in MonoTouch neu?

8

In meiner Anwendung zeige ich Daten von einem Online-Web-Service in mehrere UITableViews an. Ich habe mehrere Möglichkeiten für den Benutzer hinzugefügt, um die Daten zu aktualisieren, aber die TableView.ReloadData () -Methode scheint nicht zu funktionieren. Wenn der Benutzer eine Aktualisierung anfordert, erhalte ich eine neue Datenmenge vom Server, übergebe sie an die UITableViewSource-Instanz, die an den UITableViewController angehängt ist, und rufe dann die ReloadData () -Methode auf, die die Daten tatsächlich nicht erneut lädt. Erst nachdem ich zum Hauptbildschirm zurückgekehrt bin und dann zur Tabellenansicht zurückgekehrt bin (weil sie bereits erstellt wurde, zeige ich nur die Instanz an, die bereits existiert), erscheinen die neuen Daten in der Tabellenansicht. Was mache ich falsch? Ich habe versucht, eine neue Instanz der UITableViewSource beim Aktualisieren der Daten zu erstellen, aber das hilft auch nicht.

Hier ist der Code zum Laden von Daten in die Tabellenansicht (ich verwende es für jedes Ereignis, für das Daten in es geladen werden müssen):

%Vor%

Dieser Code wird natürlich in einem separaten Thread ausgeführt, der auf dem Hauptthread aufruft. Grundsätzlich wird derselbe Code aufgerufen, wenn der Benutzer nach einem Update fragt (eine Animation wird abgespielt, während der Hintergrundthread funktioniert).

    
Kiril 28.02.2011, 23:14
quelle

5 Antworten

13

Pavel ist richtig - versuchen Sie es Folgendes, um zu sehen, ob es funktioniert:

%Vor%

Wenn Sie in Zukunft mit etwas zu tun haben, das die derzeit angezeigte Benutzeroberfläche ändert, müssen Sie sicherstellen, dass sie im Hauptthread stattfindet (auch als GUI-Thread bezeichnet). Dieser InvokeOnMainThread ist eine Methode von NSObject und kann wie oben in allen UIViews / UIViewControllers usw. aufgerufen werden - Sie können ihn auch aus einer vollständigen C # -Klasse aufrufen:

%Vor%     
Luke 01.03.2011 08:35
quelle
3

Sie sagen, es ist in einem anderen Thread geschehen, könnte es sein, dass der Worker-Thread den UI-Thread nicht aufrufen kann? I.e. Sie sollten die ReloadData über Delegate aufrufen, um sicherzustellen, dass sie im Benutzeroberflächenthread aufgerufen wird und nicht "nur" im Worker-Thread, da sie sich gegenseitig blockieren könnte und nie tatsächlich aufgerufen wird (passiert in einem anderen Szenario).

    
Pavel Sich 01.03.2011 01:21
quelle
3

Ich bin auch auf dieses Problem gestoßen und habe diese Frage gefunden. Mit einigen Hinweisen habe ich es endlich geschafft, indem ich die DataSource zurücksetzte und ReloadView () aufruft.

%Vor%

Von meinen Tests unterscheidet es sich nicht, wenn ich ReloadView () innerhalb von InvokeOnMainThread einpacke oder nicht. Nun, das liegt vielleicht daran, dass ich keinen Worker-Thread verwende.

Es ist seltsam, dass ich in einem anderen Fall die Tabellenansicht auffrischen konnte, indem ich einfach ReloadData () in ViewDidAppear () aufruft. Der einzige Unterschied ist, dass der obige Fall die Aktualisierung in derselben Ansicht ist.

    
newman 21.11.2011 04:30
quelle
0

Sie können den Datain viewwillappear() neu laden oder den Ladedatencode in viewwillappear() setzen.

    
能蟹仔 11.08.2012 07:40
quelle
0

Für Googler:

Ich hatte die gleichen Probleme. Das ist es, was es für mich repariert hat

%Vor%     
fukijama 22.05.2015 09:31
quelle

Tags und Links