菜鸟教程小白 发表于 2022-12-12 10:59:56

ios - UITableView 的 reloadData 有时不调用 numberOfRowsInSection


                                            <p><p><code></code> 不调用 <code>numberOfRowsInSection:(NSInteger)section</code></p>

<p>如果我看到这样的问题,我会在stackoverflow中写什么作为答案:</p>

<ul>
<li>确保委托(delegate)和数据源已完美连接。</li>
<li>以防万一检查你是否从主线程调用它。</li>
</ul>

<p>我在提问之前尝试了我的答案。</p>

<p>我在 MyTableView 类(从 UITableView 扩展)中放入以下行</p>

<pre><code>- (void)reloadData{
    NSLog(@&#34;MyTableView (reloadData) self.dataSource: %@, delegate: %@, isMainThread: %d&#34;,self.dataSource,self.delegate,);

    ;

    ;
}
</code></pre>

<p>我看到它是从主线程和数据源调用的,并且委托(delegate)永远不会为零。</p>

<p>我并不好奇为什么 tableView 不调用 cellForRow,因为它首先必须调用 numberOfRows 来查看结果是否 > 0。但是,它也不会调用 numberOfRows...</p>

<p>有什么想法吗? tableView 放弃调用 numberOfRows 函数的原因是什么?</p>

<p><strong>更新:</strong>
我已经在 reloadData 函数中添加了新行来打印 FullStack 以查看它是否是从 tableView 自己的函数中调用的。结果:它们在 tableView 之外被调用,因此不应该有任何意外行为。</p>

<p><strong>更新 2:</strong>
“有时”:在我的用户开始说“有时”他们看不到表格中的更改后,我发现了这个问题。之后,我尝试在 XCode 中连续点击运行按钮,直到应用程序打开时出现此错误。 (我运行的 30% 的百分比显示此错误)。当它发生时,在我重新启动应用程序之前,reloadData 永远不会再次工作。</p>

<p><strong>更新3:</strong>
我放了 <code>self.dataSource==myExpectedViewController</code> 和 <code></code> 来查看代表是否不为零,也许他们正在被克隆等。 . 结果是 True 并且 numberOfRows 正确返回>0。所以代表是正确的,我有比零更多的项目。</p>

<p><strong>更新4:</strong>
我尝试使用新的 UITableView(删除我的自定义 UITableView),得到了相同的结果。</p>

<p><strong>更新5:</strong>
我在屏幕上放置了一个按钮,用于重新创建表格并设置其代表。每当问题中的问题发生时,我点击这个按钮,一切都开始完美运行。所以,一定有什么东西破坏了 UITableView 的内部结构,它使对 reloadData 的每次调用都无效,但我仍然找不到它。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><strong>已编辑</strong>:我尝试复制问题并发现,当我在当前 ViewController 上呈现另一个 ViewController 时,它具有此 TableView 。然后 1. 尝试用一些数据重新加载这个 tableview 和 2. 同时解除了我的 currentviewcontroller 顶部的 viewcontroller 动画,然后由于在此期间,table view 不可见,因此不会重新加载。 </p>

<p>要解决此问题,您可以在此处设置延迟或使用该动画的完成 block 来重新加载表并生效。</p>

<p>否则问题可能与线程有关,UIElement 应仅在主线程上更新。 </p>

<p>在API调用和其他过程中,我们进入了其他线程,并且在更新UIElement之前我们大多忽略了检查我们是否在主线程。 </p>

<p>您应该使用 <strong>DispatchQueue.main.async{yourTable.reloadData()}</strong> 在主线程中调用 yourTable.reloadData() 并确保在主线程中调用它。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UITableView 的 reloadData 有时不调用 numberOfRowsInSection,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16634340/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16634340/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UITableView 的 reloadData 有时不调用 numberOfRowsInSection