Comment faire pour récupérer les données dans UITableView dans MonoTouch?
Dans mon application, j'ai l'affichage de données à partir d'un web service en plusieurs UITableViews. J'ai ajouté plusieurs façons pour l'utilisateur de mettre à jour les données, mais la TableView.ReloadData() la méthode ne semble pas fonctionner.
Lorsque l'utilisateur demande une mise à jour, je reçois un nouveau jeu de données à partir du serveur, le passer à la UITableViewSource instance qui est attaché à la UITableViewController, puis d'appeler la ReloadData() la méthode, qui, malheureusement, ne fait en effet pas recharger les données. Seulement après que je retourne à l'écran principal, puis revenir à l'affichage de la table (parce qu'il est déjà créé, je viens d'affichage de l'instance qui existe déjà) les nouvelles données s'affichent dans la tableview.
Ce que je fais mal? J'ai essayé de créer une nouvelle instance de la UITableViewSource lors de la mise à jour des données, mais qui n'aide pas non plus.
Voici le code pour le chargement de données dans la tableview (je la réutiliser pour tout événement qui nécessite des données à charger):
dataControl.GetList(Tables.UPDATES)); //gets data from the server and passes it to the SQL database
Source source = GetSource(theType.Name, theType, groups); //creates a new source loaded with the data
Updates.TableView.Source = source;
Updates.TableView.AllowsSelection = false;
Updates.TableView.ReloadData();
Ce code est bien sûr exécuté dans un thread qui appelle sur le thread principal.
Fondamentalement, le même code est appelé lorsque l'utilisateur demande une mise à jour(une animation est jouée lors de la thread d'arrière-plan).
OriginalL'auteur Kiril | 2011-02-28
Vous devez vous connecter pour publier un commentaire.
Pavel est correct - essayez ce qui suit pour voir si cela fonctionne:
À l'avenir, chaque fois que vous avez affaire à quelque chose qui va changer l'INTERFACE utilisateur actuellement affiché, vous devez vous assurer qu'il prend place sur le thread principal (également connu sous le thread GUI). Cette InvokeOnMainThread est une méthode de
NSObject
peut donc être appelée comme ci-dessus dans tous lesUIViews
/UIViewControllers
etc - vous pouvez aussi l'appeler à partir d'une toute classe C# à l'aide de:comme c'est bizarre. Il ne sonne comme un problème d'actualisation. C'est exagéré, mais avez-vous essayé
TableView.SetNeedsDisplay();
ainsi?Oui, je l'avais essayé et malheureusement, il n'a pas de résultat dans quoi que ce soit. J'ai été en passant par le MonoTouch de la documentation, mais beaucoup de choses ne sont pas documentés. Je pourrais essayer de la pop à la vue de la racine de contrôleur de gestion, puis poussez le reloaded-vue-contrôleur, mais d'abord c'est un terrible hack et je tiens vraiment à utiliser une meilleure solution, et la seconde, il peut être source de confusion pour l'utilisateur (car il faut un certain temps à la pop et puis poussez la-vue-contrôleur). Merci pour l'aide!
Il pourrait être quelque chose à voir avec la façon dont vous configurez votre TableView de la source. Lorsque vous sortir de ce point de vue et puis poussez la vue arrière sur, qui serait la cause de
ViewWillAppear
d'être licencié est-il quelque chose dans la méthode que vous êtes en train de faire différemment ici? p.s. pas de soucis, je suis plutôt intrigué par cette!Salut, merci pour la réponse. Je ne fais pas n'importe quoi dans le ViewWillAppear. La source, je suis paramètre comme ceci: 'les Mises à jour.TableView.Source = new USource(certains params); " j'ai essayé de l'élimination de la TableView de la source/la contrôleur/TableView lui-même avant de lui donner une nouvelle, mais il n'a pas fait une différence. Je vais essayer de l'appeler d'une certaine manière ViewWillAppear manuellement pour voir si cela fonctionne.
OriginalL'auteur Luke
Vous dire que c'est fait dans un thread différent, se pourrait-il que le thread ne peut pas appeler le thread d'INTERFACE utilisateur? I. e. vous devez appeler la ReloadData via délégué pour être sûr qu'il est appelé dans le thread de l'INTERFACE utilisateur et non pas "seulement" dans le thread de travail, comme on pourrait le verrouillage et de ne jamais se fait appelé (qui m'est arrivé dans un scénario différent).
OriginalL'auteur Pavel Sich
J'ai aussi rencontré ce problème et trouvé cette question. À l'aide de certains de l'astuce ici, j'ai finalement obtenu le travail à zéro par la source de données et d'appel ReloadView().
De mes tests, il ne fait pas différente si j'enveloppe le ReloadView() à l'intérieur de la InvokeOnMainThread ou pas. Eh bien, c'est peut-être parce que je ne suis pas à l'aide de threads de travail.
Il est étrange que, dans un autre cas, j'ai actualiser l'affichage de la table en appelant simplement ReloadData() dans ViewDidAppear(). La seule différence est que le cas ci-dessus est la fréquence d'actualisation dans le même point de vue.
OriginalL'auteur newman
Vous pouvez recharger datain
viewwillappear()
ou de charge code de données dansviewwillappear()
.OriginalL'auteur 能蟹仔
Pour les googlers:
J'ai eu les mêmes problèmes. C'est ce qu'il fixe pour moi
OriginalL'auteur fukijama