菜鸟教程小白 发表于 2022-12-13 16:12:08

ios - UICollectionView 不重用单元格


                                            <p><p>我正在尝试使用 UICollectionView 模仿 UITableView 布局。</p>
<pre><code>layout.itemSize = CGSizeMake(CGRectGetWidth(self.view.bounds), 44.0f);
</code></pre>
<p>我注册了可重用单元类。</p>
<pre><code>
            forCellWithReuseIdentifier:NSStringFromClass()];
</code></pre>
<p>注意:<code>SampleClass</code> 只是 <code>UICollectionViewCell</code> 的子类,不包含任何内容。</p>
<p>并符合数据源:</p>
<pre><code>- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 28;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = )
                                                                           forIndexPath:indexPath];

    return cell;
}
</code></pre>
<p>我发现 <code>SampleCell</code> 没有被重用。为了验证它,我们可以简单地在 <code>UICollectionView</code> 中记录 subview 的数量。</p>
<pre><code>- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@&#34;number of subviews in collection view is: %li&#34;, (long)self.collectionView.subviews.count);
}
</code></pre>
<p>滚动后,我得到了这个日志:</p>
<blockquote>
<p>number of subviews in collection view is: 30</p>
<p>number of subviews in collection view is: 30</p>
<p>number of subviews in collection view is: 30</p>
<p>number of subviews in collection view is: 30</p>
</blockquote>
<p>请注意,有 30 个 subview (其中 2 个是 ScrollView 指示器)。</p>
<p>这意味着所有 28 个项目都会显示,而不会从 superview 中删除不可见的单元格。为什么会这样?</p>
<p>为了方便您,我在 Github 上提供了一个示例项目。
<a href="https://github.com/edwardanthony/UICollectionViewBug" rel="noreferrer noopener nofollow">https://github.com/edwardanthony/UICollectionViewBug</a> </p>
<h3>更新:</h3>
<p>我还使用内存图层次结构调试器检查了内存分配,它被分配了 28 次。</p>
<p> <a href="/image/zF2Ho.png" rel="noreferrer noopener nofollow"><img src="/image/zF2Ho.png" alt=""/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我确实在工作,只是由于更积极的缓存而在内存中保留了更多。如果您尝试将项目数从 28 更改为 100,您会看到滚动时它保持在 33 个 subview 。</p>

<p>尝试将以下代码添加到您的 <code>SampleCell</code> 类中,您会看到它被调用,但可能与您期望的不完全一样。</p>

<pre><code>- (void)prepareForReuse {
    ;

    NSLog(@&#34;prepareForReuse called&#34;);
}
</code></pre>

<p><code>UICollectionView</code> 具有比 <code>UITableView</code> 更高级的缓存方案(或至少与以前一样),这就是您看到自己所做的事情的原因。根据文档,它说 <em>默认情况下启用单元格预取</em>:</p>

<blockquote>
<p>UICollectionView provides two prefetching techniques you can use to
improve responsiveness: <br/>
</p><li> <strong>Cell prefetching</strong> prepares cells in advance of
the time they are required. When a collection view requires a large
number of cells simultaneously—for example, a new row of cells in grid
layout—the cells are requested earlier than the time required for
display. Cell rendering is therefore spread across multiple layout
passes, resulting in a smoother scrolling experience. Cell prefetching
is enabled by default. <br/><br/>
</li><li> <strong>Data prefetching</strong> provides a mechanism whereby
you are notified of the data requirements of a collection view in
advance of the requests for cells. This is useful if the content of
your cells relies on an expensive data loading process, such as a
network request. Assign an object that conforms to the
UICollectionViewDataSourcePrefetching protocol to the
prefetchDataSource property to receive notifications of when to
prefetch data for cells.<p></p>
</li></blockquote>

<p>您可以通过将此行添加到示例中的 <code>setupCollectionView</code> 函数来关闭单元格预取:</p>

<pre><code>self.collectionView.prefetchingEnabled = NO;
</code></pre>

<p>这样做将使您的示例按预期工作。在我的情况下, subview 计数将下降到 18。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UICollectionView 不重用单元格,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/56962221/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/56962221/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UICollectionView 不重用单元格