1

我们已经设置了我们的 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"); 私有静态只读 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();

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

4

2 回答 2

3

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

于 2013-11-12T11:17:54.147 回答
1

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

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

例子

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

我会建议:

  1. 泡一杯茶,
  2. 仔细查看显示屏 - 你能确定哪些单元格和哪些单元格值是“不正确的”吗?你能在那些单元格中添加一个调试字段,告诉你单元格是否有正确的列表项,因为它是数据上下文
  3. 一旦您确定出了什么问题,请查看这些“不正确”的单元格和单元格值是如何创建和设置的 - 这可能会导致您确定问题所在
  4. 如果没有,请尝试在单独的测试应用程序中重现效果,例如https://github.com/slodge/ListApp - 您可以在此处与您的同事和其他人分享这些效果,以便他们提供帮助

据我所知,这只是正常的调试和开发(尤其是第1步)

于 2013-10-31T13:06:06.220 回答