Top TableView单元格未更新

问题描述:

我目前正在开发一个使用MvvmCross和Xamarin iOS的应用程序。 该应用程序的主视图分为两部分。视图的下半部分是表格视图。Top TableView单元格未更新

表视图由填充正常工作的异步散布填充。

如果用户点击以选择项目,则会导航到另一个视图,以便他们更新所选项目。更新会导致数据源重新加载(因为编辑可能影响了其他项目)以及要重新加载的表视图。

重新加载过程中,表视图不在视图中;然而重装是在主线程上执行的。

在所有情况下,除了选择顶部可见行之外,此功能都能正常工作。在这种情况下,单元从不更新。每次选择重用时,视图都会使用它创建的初始数据进行渲染。

从控制台输出我可以看到准备重用正在所有的单元格上调用。我也可以确认表上的重载操作正在主线程上调用。

表数据源(从MvxSimpleTableSource扩展而来)会调用GetOrCreateCellFor的重载,并更新绑定项的数据。 我的所有调查都无法解决问题。

请任何人都可以帮忙。

更新:我现在已经解决了这个问题,想了解它为什么会发生。

该问题似乎是由于MvxSimpleTableSource的RowSelected方法的过载所致。

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(); await this.TableView.ReloadData();}' – Jon

+0

如果您希望有人帮助,请发布一个最小可重现样本 – Cheesebaron

不是100%肯定,但我相信调用,这可能是这个问题:

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

GetCell是让细胞显示时由操作系统调用的方法。我不认为你应该自己调用这个。相反,您可以使用tableView.CellAt(indexPath),因此请尝试替换上面的行:

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