滚动时出现MvxTableViewSource DequeueReusableCell问题

时间:2013-10-30 16:28:23

标签: ios xamarin.ios mvvmcross

我们已经设置了tableviewSource和tableview,但是在错误的单元格中出现的数据存在问题,并且在滚动大量单元格时选择应用于多个单元格的状态。

表格单元格是根据表格单元格/表格视图上的n+1教程设置的,只有在部分表因大小而隐藏时才会出现问题。

关于如何解决这个问题的任何想法?

var menuItem = item as MenuItemViewModel;

if (menuItem != null && menuItem.ViewModelType == null)
{
    NSString cellId = new NSString("Menu Header Cell");
    var headerCell = tableView.DequeueReusableCell(cellId, indexPath) as MenuItemHeaderCell;

    if (headerCell == null)
    {
        headerCell = new UITableViewCell(UITableViewCellStyle.Default, cellId) as MenuItemHeaderCell;
    }
    return headerCell;
}
else
{
    NSString cellId = new NSString("Menu Cell");
    var cell = tableView.DequeueReusableCell(cellId, indexPath) as MenuItemCell;
    if (cell == null)
    {
        cell = new UITableViewCell(UITableViewCellStyle.Default, cellId) as MenuItemCell;
    }
    return cell;
}

根据您的评论,我更新了以下代码:

private static readonly NSString MenuHeaderCellIdentifier = new NSString(“Menu Header Cell”);             private static readonly NSString MenuItemCellIdentifier = new NSString(“Menu Cell”);

        public MenuTableViewSource(UITableView tableView): base(tableView)
        {
            tableView.RegisterClassForCellReuse(typeof(MenuItemHeaderCell), MenuHeaderCellIdentifier);
            tableView.RegisterClassForCellReuse(typeof(MenuItemCell), MenuItemCellIdentifier);
        }


        protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
        {
            NSString cellIdentifier;

            var menuItem = item as MenuItemViewModel;
            if (menuItem.ViewModelType == null)
            {
                cellIdentifier = MenuHeaderCellIdentifier;
            }
            else
            {
                cellIdentifier = MenuItemCellIdentifier;

            }
            var cell = (UITableViewCell)TableView.DequeueReusableCell(cellIdentifier, indexPath);
            return cell;

        }

绑定设置如下:

var source = new MenuTableViewSource(TableView);
TableView.Source = source;
TableView.RowHeight = 46;

var set = this.CreateBindingSet<LeftMenuView, LeftMenuViewModel>();
set.Bind(source).To(vm => vm.MenuItems);
set.Apply();

TableView.ReloadData();

重复使用问题仍在发生。基本上,如果单元格在屏幕外,则在滚动时会开始拾取不正确的值。还有什么我们应该做的吗?

2 个答案:

答案 0 :(得分:3)

感谢Stuart提供的示例代码。经过几个小时的调查问题后,我发现它只在iOS7上发生了几个小时之后,我意识到这是因为我们添加了一个本地创建的变量,然后延迟绑定到它,这似乎导致价值消失范围。将此更改为成员变量可以阻止这种情况发生,这是漫长的一天,添加到了陷阱的银行。

答案 1 :(得分:1)

我花了10分钟创建了这个示例应用程序 - github.com/slodge/ListApp

它使用DequeueReusableCell代码,与您的问题中显示的代码完全相同,似乎工作正常

Example

鉴于此结果,我怀疑问题需要在您的应用中进行调查。

我建议:

  1. 泡一杯茶,
  2. 仔细查看显示 - 您可以识别哪些单元格和哪些单元格值“不正确”?你可以向这些单元格添加一个调试字段,告诉你单元格是否具有正确的列表项,因为它是datacontext
  3. 一旦确定出现了什么问题,请查看如何创建和设置这些“不正确”的单元格和单元格值 - 这可能会让您确定问题所在
  4. 如果没有,请尝试在单独的测试应用中重现效果,例如https://github.com/slodge/ListApp - 这将是您可以与同事和其他人分享的内容,以便他们可以提供帮助
  5. 据我所知,这只是正常的调试和开发(特别是第1步)