我们已经设置了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();
重复使用问题仍在发生。基本上,如果单元格在屏幕外,则在滚动时会开始拾取不正确的值。还有什么我们应该做的吗?
答案 0 :(得分:3)
感谢Stuart提供的示例代码。经过几个小时的调查问题后,我发现它只在iOS7上发生了几个小时之后,我意识到这是因为我们添加了一个本地创建的变量,然后延迟绑定到它,这似乎导致价值消失范围。将此更改为成员变量可以阻止这种情况发生,这是漫长的一天,添加到了陷阱的银行。
答案 1 :(得分:1)
我花了10分钟创建了这个示例应用程序 - github.com/slodge/ListApp
它使用DequeueReusableCell
代码,与您的问题中显示的代码完全相同,似乎工作正常
鉴于此结果,我怀疑问题需要在您的应用中进行调查。
我建议:
据我所知,这只是正常的调试和开发(特别是第1步)