Как перезагрузить данные в UITableView в MonoTouch? - PullRequest
8 голосов
/ 01 марта 2011

В моем приложении я отображаю данные из онлайн-сервиса в несколько UITableView. Я добавил несколько способов обновления данных для пользователя, но метод TableView.ReloadData (), похоже, не работает. Когда пользователь вызывает обновление, я получаю новый набор данных с сервера, передаю его экземпляру UITableViewSource, который присоединен к UITableViewController, а затем вызываю метод ReloadData (), который, к сожалению, фактически не перезагружает данные. Только после того, как я вернусь на главный экран и затем вернусь к табличному представлению (поскольку оно уже создано, я просто отображаю уже существующий экземпляр), новые данные отображаются в табличном представлении. Что я делаю неправильно? Я попытался создать новый экземпляр UITableViewSource при обновлении данных, но это тоже не помогает.

Вот код для загрузки данных в табличное представление (я использую его для любого события, которое требует загрузки данных в него):

 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();

Этот код, конечно, выполняется в отдельном потоке, который вызывается в основном потоке. По сути, тот же код вызывается, когда пользователь запрашивает обновление (анимация воспроизводится во время работы фонового потока).

Ответы [ 5 ]

13 голосов
/ 01 марта 2011

Павел правильный - попробуйте следующее, чтобы увидеть, работает ли он:

InvokeOnMainThread(delegate{
    Updates.TableView.Source = source;
    Updates.TableView.AllowsSelection = false;
    Updates.TableView.ReloadData();
});

В будущем, когда вы будете иметь дело с чем-то, что изменит отображаемый пользовательский интерфейс, вынеобходимо убедиться, что это происходит в главном потоке (также известном как поток GUI).Этот InvokeOnMainThread является методом из NSObject, поэтому его можно вызывать, как указано выше, во всех UIViews / UIViewControllers и т. Д. - его также можно вызывать из полностью класса C #, используя:

MonoTouch.UIKit.UIApplication.SharedApplication.InvokeOnMainThread(delegate{ /*code here*/ });
3 голосов
/ 21 ноября 2011

Я тоже столкнулся с этой проблемой и нашел этот вопрос.Воспользовавшись некоторыми подсказками, я наконец-то заполучил его, перезапустив DataSource и вызвав ReloadView ().

tableView.DataSource = new MyDataSource(...);
tableView.RelaodData();

Из моего тестирования ничего не изменилось, если я обернул ReloadView () внутриInvokeOnMainThread или нет.Ну, это может быть потому, что я не использую рабочий поток.

Странно, что в другом случае я мог бы обновить представление таблицы, просто вызвав ReloadData () в ViewDidAppear ().Разница лишь в том, что приведенный выше случай - это обновление в том же виде.

3 голосов
/ 01 марта 2011

Вы говорите, что это сделано в другом потоке, может быть, рабочий поток не может вызвать поток пользовательского интерфейса? То есть Вы должны вызывать ReloadData с помощью делегата, чтобы убедиться, что он вызывается в потоке пользовательского интерфейса, а не «только» в рабочем потоке, поскольку он может блокироваться и никогда не вызываться в действительности (произошло со мной в другом сценарии).

0 голосов
/ 22 мая 2015

Для googlers:

У меня были те же проблемы.Это то, что исправило для меня

InvokeOnMainThread(delegate {
    myTableView.Source = new TableViewSource();
    myTableView.ReloadData();
    this.View.SetNeedsDisplay();
});
0 голосов
/ 11 августа 2012

Вы можете перезагрузить данные viewwillappear() или установить код загрузки данных в viewwillappear().

...