菜鸟教程小白 发表于 2022-12-13 07:04:10

ios - 在 UICollectionView 中调用 reloadData 后未调用 cellForRowAtIndexPath


                                            <p><p>我有一个 <code>UICollectionView</code>,它使用 <code>UICollectionViewCell</code> 的子类。最初,我的 <code>dataSource</code> 包含 5 个项目,当用户向下滚动时,我获取更多数据并将它们添加到我的 <code>dataSource</code>,然后我调用 <code>reloadData</code>.</p>

<p>但只有 3 个项目可见。当我向上滚动时,我看不到其余的项目,只是一个空白区域。我注意到 <code>cellForRowAtIndexPath</code> 只为这 3 个项目调用。</p>

<p>当我导航到我的父 View 并返回到包含我的 <code>UICollectionView</code> 的 View 时,我可以看到所有项目。</p>

<p><strong>注意:</strong>我已经实现了 <code>layout:sizeForItemAtIndexPath</code> 函数,因为每个单元格都有不同的大小。 </p>

<p><strong>编辑:</strong></p>

<p>我部分解决了这个问题。我有一个 refreshControl,我在后台线程中调用了 endRefreshing。</p>

<p>我正在添加图片以便更好地演示现在发生的事情:</p>

<ul>
<li>第一张图片是在获取新数据之前,您可以看到数据显示完美。</li>
</ul>

<p> <img src="/image/x4mFs.png" alt="enter image description here"/> </p>

<ul>
<li>第二张图片是在获取新数据后,您可以看到新项目的高度与之前的项目(旧单元格)完全相同,并且有一个空白区域,当我向下滚动时,我可以看到其余部分数据,当我向上滚动时,顶部的单元格得到正确的高度,如第三张图片所示。</li>
</ul>

<p> <img src="/image/tAXQe.png" alt="enter image description here"/> </p>

<p> <img src="/image/CNJLm.png" alt="enter image description here"/> </p>

<p>完成加载新项目后,我调用此方法</p>

<pre><code>- (void)updateDataSource
{
   self.collectionViewDataSource = _manager.messages;
   ;
}
</code></pre>

<p>我检查了 numberOfItemsInSection 方法,它返回正确的项目数。</p>

<p>这是我的布局:sizeForItemAtIndexPath</p>

<pre><code>- (CGSize)collectionView:(UICollectionView *)collectionView layout:   (UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Here I am calculating the width and height of the textView which will fit the message

SPH_PARAM_List *feed_data=[init];
feed_data=;

if (||)
{

    NSAttributedString *aString = [ initWithString:feed_data.chat_message];

    UITextView *calculationView = [ init];
    ;

    ];
    ;


    CGSize sc = ;

    NSLog(@&#34;IndexPath: %li Height: %f&#34;, (long)indexPath.row ,sc.height);

    return CGSizeMake(self.view.frame.size.width - (5 * 2), sc.height);

}

return CGSizeMake(self.view.frame.size.width - (5 * 2), 90);
</code></pre>

<p>}</p>

<p><strong>编辑 2:</strong></p>

<p>我注意到 layout:collectionViewLayoutsizeForItemAtIndexPath: 被调用并返回正确的高度,但 cellForItemAtIndexPath 仍然处理旧的。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可能需要使布局无效,以便重新计算单元格位置和高度,因为简单地重新加载数据不会正确设置单元格高度(因为单元格被重复使用)。</p>

<pre><code>- (void)updateDataSource
{
   self.collectionViewDataSource = _manager.messages;
   ;
   // Add this line.
   ;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 UICollectionView 中调用 reloadData 后未调用 cellForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30104037/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30104037/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 UICollectionView 中调用 reloadData 后未调用 cellForRowAtIndexPath