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

Posted

技术标签:

【中文标题】iOS - UITableView - 快速滚动时神秘地重复自己的行? (模拟器)【英文标题】:iOS - UITableView - Rows mysteriously repeating themselves when scrolling quickly? (simulator) 【发布时间】:2014-02-18 00:22:52 【问题描述】:

我目前正在使用 Monotouch (Xamarin) 框架开发 ios 应用程序。

我有一个自定义表格视图源,它使用自定义单元格,其单元格高度是动态计算的。

当我在 iOS 模拟器中运行项目时,如果我快速滚动到底部或顶部,顶部的单元格会替换底部的单元格,反之亦然 - 好像绘制不正确,或者错误地重复使用了错误的单元格?

澄清一下——如果我的细胞是

一个 二 三 四 五

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

一个 二 三 四 一个

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

五个 二 三 四 五

如果我偶尔上下滚动,单元格可能会随机混合。

我的表格源如下:

    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 模拟器,而这不会发生在设备上?有解决办法吗?

【问题讨论】:

【参考方案1】:

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

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

在你有了一个单元格之后,然后你用那个索引路径所需的内容填充这个单元格。

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 返回的高度。

以上是关于iOS - UITableView - 快速滚动时神秘地重复自己的行? (模拟器)的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 在快速滚动时崩溃

自 iOS 9 以来 UITableView 的滚动性能不佳(之前效果很好)

快速滚动时带有 AlamofireImage 的 Swift UItableview 崩溃

iOS UITableView在过滤时滚动插入

在 iOS 的 UITableView 中滚动时索引错误

IOS - 滚动时将 UIView 保持在 UITableView 之上