2017-01-30 5 views
-1

В настоящее время я разрабатываю приложение с использованием MvvmCross и Xamarin iOS. Основной вид приложения разделен на два. Нижняя половина представления представляет собой табличный вид.Top TableView Cell не обновляется

Вид таблицы заполнен асинхронными проспектами, который работает правильно.

Если пользователь выбирает элемент, он перемещается в другое представление, которое позволяет им обновлять выбранный элемент. Обновление приводит к перезагрузке источника данных (поскольку изменение может повлиять на другие элементы) и представление таблицы для перезагрузки.

Вид таблицы не отображается во время процесса перезагрузки; однако перезагрузка выполняется в основном потоке.

Во всех случаях это работает правильно, кроме того, когда выбирается верхняя видимая строка. В этом случае ячейка никогда не обновляется. Каждый раз, когда он выбран для повторного использования, рендеринг отображается с исходными данными, с которыми он был создан.

Из вывода на консоли я вижу, что подготовка к повторному использованию вызывается во всех ячейках. Я также могу подтвердить, что операция перезагрузки в таблице вызывается в основном потоке.

Источник данных таблицы (расширенный от MvxSimpleTableSource) вызывает перегрузку для GetOrCreateCellFor, а данные для связанных элементов обновляются. Все мои расследования не смогли решить проблему.

Пожалуйста, кто-нибудь может помочь.

Обновление: теперь я решил решить проблему, хотел бы понять, почему это происходит.

Проблема, по-видимому, связана с использованием команды RowSelected для MvxSimpleTableSource.

public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
{ 
    try 
    { 
     if (!this.parent.ViewModel.IsLocked) 
     { 
      /* Removing the following code enables the top visable cell to 
      *  be reloaded correctly 
      if (this.highlightedRow == null || this.highlightedRow.Row != indexPath.Row) 
      { 
       var cell = this.GetCell(tableView, indexPath) as CustomTableCellWithImage; 
       if (cell != null) 
       { 
        cell.ContentView.BackgroundColor = this.parent.HighlightColor; 
       } 
      } 
      *  End of removed code 
      */ 
      this.parent.ViewModel.SetNavigationDate(); 
      base.RowSelected(tableView, indexPath); 
     } 
    } 
    catch (Exception ex) 
    { 
     this.parent.ViewModel.LogError(ex, "RowSelected indexPath: {0}", indexPath.ToString()); 
    } 
} 

Связанная команда является асинхронной, и код работает для всех выбранных строк, если это не верхняя видимая строка.

Когда пользователь выбирает верхнюю видимую строку, ячейка, похоже, попадает в состояние, когда представление никогда не обновляется, даже когда SetNeedsDisplay вызывается непосредственно.

+0

Можете ли вы разместить код? –

+0

Я не знаю, полезный код будет без всего решения. эффективно процесс обновления выглядит следующим образом: InvokeOnMainThread (async() => {await this.ViewModel.ReloadDataToDate(); wait this.TableView.ReloadData();} ' – Jon

+0

Опубликовать минимальный воспроизводимый образец, если вы ожидаете, что кто-то поможет вы. – Cheesebaron

ответ

0

не 100% уверен, но я считаю, называя это может быть вопрос:

var cell = this.GetCell(tableView, indexPath) as CustomTableCellWithImage; 

GetCell является метод, который называется операционной системой при получении клеток для отображения. Я не думаю, что вы должны это назвать сами. Вместо этого вы можете использовать tableView.CellAt(indexPath), поэтому попробуйте заменить указанную выше строку следующим образом:

var cell = tableView.CellAt(indexPath) as CustomTableCellWithImage;