gpt4 book ai didi

c# - UITableViewDelegate 中的问题 - RowSelected 给出了错误的 NSIndexPath

转载 作者:行者123 更新时间:2023-11-29 13:50:32 24 4
gpt4 key购买 nike

我有一个 UITableViewSource,我已经对其进行了子类化。我正在覆盖 GetCell 并使用我自己的子类单元格,如下所示:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
MarketItem item=_tableItems[indexPath.Section].Items[indexPath.Row];
MarketCell cell=tableView.DequeueReusableCell(_cellIdentifier) as MarketCell;

if (cell==null)
{
cell=new MarketCell(UITableViewCellStyle.Subtitle,_cellIdentifier,item);
}

// decorate the cell
// ...

return cell;
}

这行得通,但是当我在 UITableViewDelegate 中获取事件时,索引路径让我获取了错误的单元格(如 AccessoryButtonTapped、WillSelectRow 等事件)。

节号和行号看起来是正确的,但是当我做一个

 tableView.CellAt(indexPath)

我弄错了单元格。 (行号和节号再次看起来是正确的。)

注意事项:

  • 表格不断更新 - 项目到达不同的线程,然后 InvokeOnMainThread'd
  • 虽然表格不断更新,但只是添加了行和部分 - 没有重新排序或删除任何内容
  • 如果我在收到“WillSelectRow”时暂停更新,那也无济于事
  • 最有趣的是(但不是可交付的解决方案)如果我每次都创建一个新单元而不是执行 DequeueReusableCell,它会正常工作。

我不禁认为这是我自己制造的一个愚蠢的错误,但找不到它。非常感谢您提供任何帮助!

最佳答案

您可以尝试不同的方法,如上所示:http://simon.nureality.ca/?p=91

基本上,不要将 UITableViewCell 子类化,而是将 UIViewController 子类化为“MarketCellController”。这个自定义 Controller 维护一个标准的 UITableViewCell 以及您的自定义内容,并通过 AddSubview() 简单地添加您的自定义内容。

您为每个所需的单元格创建一个新 Controller 并将它们存储到字典中。

诀窍:通过为单元分配唯一标签,您可以从字典中检索关联的 Controller 。

简单示例:

Dictionary<int,MarketCellController> controllers = new Dictionary<int,MarketCellController>();

// ...

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) {
UITableViewCell cell = tableView.DequeueReusableCell(_cellIdentifier);
MarketCellController cellController;

if (cell == null) {
cellController = new MarketCellController();
cell = cellController.Cell;
controllers.Add(cell.Tag, cellController);
} else {
cellController = controllers[cell.Tag];
}

// Decorate the cell (using Methods of your cellController)
// ...

return cell;
}

这最终可以避免子类化 UITableViewCells 和出队的问题。

编辑:

我只是想到了其他事情:您似乎只是在 MarketCell 构造函数上分配您的项目。然而,出队的单元格有它们的旧项目集,你需要在出队后将其重置为新项目。

移除构造函数的 item 参数(它无论如何都会被覆盖)并改为创建一个公共(public)属性(或 setter)。在获取单元格后使用它来分配正确的项目(无论它是出列的还是新创建的)。应该这样做:

MarketCell cell = tableView.DequeueReusableCell(_cellIdentifier) as MarketCell;
if (cell == null) {
cell = new MarketCell(UITableViewCellStyle.Subtitle, _cellIdentifier);
}

// Assign the correct item
cell.Item = item;
// or (whatever you like more):
// cell.SetItem(item);

// Decorate the cell
// ...

return cell;

我的 cellController 方法也是如此。无论一个单元格是出列的还是新的,您都应该始终重置该单元格上可能与任何其他单元格不同的所有内容。

顺便说一句:如果您将单元格硬编码为 UITableViewCellStyle.Subtitle,您也可以从构造函数中省略它并将其硬编码到您的 MarketCell 类中。

至于 cellController 方法的值(value):您将 UITableViewCell 与您的自定义数据和行为分离,从而获得一个很好的分离层。您的单元格 Controller 不必像表格单元格一样工作;)

关于c# - UITableViewDelegate 中的问题 - RowSelected 给出了错误的 NSIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4861196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com