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,单元格也会进入视图永远不会更新的状态。
答
不是100%肯定,但我相信调用,这可能是这个问题:
var cell = this.GetCell(tableView, indexPath) as CustomTableCellWithImage;
GetCell
是让细胞显示时由操作系统调用的方法。我不认为你应该自己调用这个。相反,您可以使用tableView.CellAt(indexPath)
,因此请尝试替换上面的行:
var cell = tableView.CellAt(indexPath) as CustomTableCellWithImage;
您可以发布一些代码吗? –
我不知道有用的代码将没有整个解决方案。有效的刷新过程如下InvokeOnMainThread(async()=> {await this.ViewModel.ReloadDataToDate(); await this.TableView.ReloadData();}' – Jon
如果您希望有人帮助,请发布一个最小可重现样本 – Cheesebaron