Monotouch:重用UITableViewCell的正确方法

| 我正在寻找在UITableView中重用单元格的正确方法,我会知道我使用的机制是否正确。 情况如下。 我有一个UITableView,它显示从Web服务获取的数据列表。
_listOfItems = e.Result as List<Item>;
_listOfItems是实例变量。 此列表传递给扩展UITableViewSource的类。显然,此类重写GetCell方法以这种方式可视化数据:
public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{       
    UITableViewCell cell = tableView.DequeueReusableCell(_cID);

    Item item = _listOfItems[indexPath.Row];

    int id = item.Id;

    if (cell == null)
    {   
        cell = new UITableViewCell(UITableViewCellStyle.Value1, _cID);

        cell.Tag = id;

        _cellControllers.Add(id, cell);
    }
    else
    {
        bool vb = _cellControllers.TryGetValue(id, out cell);

        if(vb)
        {
            cell = _cellControllers[id];
        }

        else
        {
            cell = new UITableViewCell(UITableViewCellStyle.Value1,  _cID);             
            cell.Tag = id;

            _cellControllers.Add(id, cell);
        }
    }

    cell.TextLabel.Text = item.Title;

    return cell;
}
哪里 _cID是单元的实例变量标识符
string _cID = \"MyCellId\";
_cellControllers是用于存储Item实例的单元格和相对ID的字典
Dictionary<int, UITableViewCell> _cellControllers;
我正在使用字典来存储单元格,这是因为当行被点击时,我必须检索被点击的单元格的ID(通过cell.Tag值),执行一些其他操作-即从服务中获取其他一些数据-并然后使用新值再次更新该单元格。在这种情况下,每个单元必须是唯一的。 所以,我的问题是: 这是重用单元格的正确方法,还是可以找到另一种方法来重用单元格并确保单元格的每个抽头是唯一的? 我希望一切都清楚:)预先谢谢。问候。     
已邀请:
我认为您在这里所做的事情太多了。尤其是在字典中包含对单元格的额外引用的部分。 我会做不同的事情。使用DequeueReusableCell方法,您可以检索任何现有单元格,但不必检索其包含的值。这样的话就足够了:
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{

    int rowIndex = indexPath.Row;
    Item item  = _listOfItems[rowIndex];

    UITableViewCell cell = tableView.DequeueReusableCell(_cID);

    if (cell == null)
    {
        cell = new UITableViewCell(UITableViewCellStyle.Value1, _cID);
    }

    // Store what you want your cell to display always, not only when you are creating it.
    cell.Tag = item.ID;
    cell.TextLabel.Text = item.Title;

    return cell;
}
然后,在RowSelected方法中,更改数据源:
public override void RowSelected (UITableView tableView, NSIndexPath indexPath){
    // Do something here to change your data source _listOfItems[indexPath.Row] = new Item();
}
如果我正确理解您要做什么,则此解决方案会更好。     
如果使用我的MonoTouch.Dialog库,它将为您省去很多麻烦,该库将为您处理所有这些详细信息,并且完全满足您的需求。它可以让您专注于您的应用程序,而不是专注于管理功能,而且我相信它可以使您更快地移动,可以从以下途径获得它: http://github.com/migueldeicaza/MonoTouch.Dialog 此代码的第一个问题是,它将单元格硬编码为单一类型。通常,您必须首先检查节/行,然后根据此信息确定所需的单元格类型。 一旦确定了所需的单元格类型,就可以使用此信息来调用DequeueReusableCell并使用与此单元格ID关联的令牌。例如,对于包含输入行的单元格与包含图像的单元格,这是不同的。您需要出队正确的单元格。 您无需使每个单元格都唯一,所需的所有信息都在节/行中,因此您需要的是将节/行映射到唯一单元的内容。一种简单的方法是只有一个部分,而该行是您要从中获取更多信息的数据数组的索引。 有关创建这些单元格的最佳做法的小指南,可以在这里找到: http://tirania.org/monomac/archive/2011/Jan-18.html 如果您使用的是MonoTouch.Dialog,则整个代码可能是:
var elements = \"foo, bar, baz\";
var dvc = new DialogViewController ();
dvc.Root = new RootElement (\"My results\") {
    from x in elements.Split (\',\')
        select (Element) new StringElement (x);
};
dvc.Root.Add (\"Final one\");

current.PresentModalViewController (dvc, true);
上面的代码使用Linq创建了一个包含4行的UITableView,其中一个行用于\“ foo \”,\“ bar \”和\“ baz \”,并在末尾添加了一个额外的节点,以展示如何使用Add API。 您还可以使用多种分类的元素,您不仅限于String元素。     

要回复问题请先登录注册