iOS-UITableView-快速滚动时,行会神秘地重复自己?(模拟器)

iOS-UITableView-快速滚动时,行会神秘地重复自己?(模拟器),ios,uitableview,xamarin.ios,Ios,Uitableview,Xamarin.ios,我目前正在使用Monotouch(Xamarin)框架开发一个iOS应用程序 我有一个自定义tableview源,它使用自定义单元格,单元格高度是动态计算的 当我在iOS simulator中运行项目时,如果我快速滚动到底部或顶部,顶部单元格将替换底部单元格,反之亦然-好像它绘制错误,或者错误地重用了错误的单元格 只是想澄清一下-如果我的细胞是 一个 二 三 四 五 如果我从上到下快速滚动,我的单元格显示为 一个 二 三 四 一个 或者,如果我慢慢滚动到底部,单元格保持有序,一旦我快速滚动到顶部

我目前正在使用Monotouch(Xamarin)框架开发一个iOS应用程序

我有一个自定义tableview源,它使用自定义单元格,单元格高度是动态计算的

当我在iOS simulator中运行项目时,如果我快速滚动到底部或顶部,顶部单元格将替换底部单元格,反之亦然-好像它绘制错误,或者错误地重用了错误的单元格

只是想澄清一下-如果我的细胞是

一个 二 三 四 五

如果我从上到下快速滚动,我的单元格显示为

一个 二 三 四 一个

或者,如果我慢慢滚动到底部,单元格保持有序,一旦我快速滚动到顶部,我将得到

五 二 三 四 五

如果我偶尔上下滚动,细胞会随机混合

我的表源如下所示:

    PostModel[] models;
    string cellIdentifier = "FeedCell";
    public FeedSource (PostModel[] items)
    {
        models = items;
    }
    public override int RowsInSection (UITableView tableview, int section)
    {
        return models.Length;
    }

    public override float GetHeightForRow (UITableView tableView, NSIndexPath indexPath)
    {
        FeedCell cell = this.GetCell (tableView, indexPath) as FeedCell;

        var height = cell.height;
        return height;
    }

    public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
    {
        FeedCell cell = tableView.DequeueReusableCell (cellIdentifier) as FeedCell;
        //if there are no cells to reuse, create a new one
        if (cell == null) {
            cell = new FeedCell (models [indexPath.Row], new NSString (cellIdentifier));
            cell.LayoutSubviews ();
        }
        //cell.height = cell.height;

        return cell;
    }
我听说过动态单元高度的性能问题,但我只测试了5个单元,这似乎很奇怪


它可能只是我的iOS模拟器,而这不会发生在设备上吗?是否对此进行了修复?

只要有可能,就会重复使用单元格。逻辑是给我任何可用的单元(
DequeueReusableCell
),如果没有可用的单元(
cell==null
),则创建一个新单元(
newfeedcell

因此,创建单元格时不应固定单元格内容。您只需要创建一个新的空单元格

有了一个单元格之后,就可以在单元格中填充索引路径所需的内容

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
    FeedCell cell = tableView.DequeueReusableCell (cellIdentifier) as FeedCell;
    //if there are no cells to reuse, create a new one
    if (cell == null) {
        cell = new FeedCell (new NSString (cellIdentifier));
    }

    cell.model = models[indexPath.row]; // assuming you can do something like this.
    cell.layoutSubviews();

    return cell;
}

只要可能,单元就可以重复使用。逻辑是给我任何可用的单元(
DequeueReusableCell
),如果没有可用的单元(
cell==null
),则创建一个新单元(
newfeedcell

因此,创建单元格时不应固定单元格内容。您只需要创建一个新的空单元格

有了一个单元格之后,就可以在单元格中填充索引路径所需的内容

public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
    FeedCell cell = tableView.DequeueReusableCell (cellIdentifier) as FeedCell;
    //if there are no cells to reuse, create a new one
    if (cell == null) {
        cell = new FeedCell (new NSString (cellIdentifier));
    }

    cell.model = models[indexPath.row]; // assuming you can do something like this.
    cell.layoutSubviews();

    return cell;
}

谢谢我没有将我的单元格初始化为可重用的单元格,而是正常初始化并返回它,这就解决了问题。。。但为什么内容重复,而不仅仅是大小?是否不可能以完全动态的高度重用单元格?@JasonMcGraw我在Objective-C中做过。我只能假设这在C中是可能的。单元格必须是可调整大小的。@JasonMcGraw
GetHeightForRow
需要独立于
GetCell
确定单元格的高度。
GetCell
返回的单元格必须符合
GetHeightForRow
返回的高度。谢谢。我没有将我的单元格初始化为可重用的单元格,而是正常初始化并返回它,这就解决了问题。。。但为什么内容重复,而不仅仅是大小?是否不可能以完全动态的高度重用单元格?@JasonMcGraw我在Objective-C中做过。我只能假设这在C中是可能的。单元格必须是可调整大小的。@JasonMcGraw
GetHeightForRow
需要独立于
GetCell
确定单元格的高度。
GetCell
返回的单元格必须符合
GetHeightForRow
返回的高度。