菜鸟教程小白 发表于 2022-12-12 14:23:58

ios - viewDidLayoutSubviews 卡在空白方法的无限循环中


                                            <p><p>我有一个在 UIStoryboard 中使用 UITableView 设置的 ViewController 。 UITableView 在所有四个边都被限制在 Controller 的 SafeArea 中。</p>

<p>这个问题好像以前也有人问过,但是每次我发现这个问题,都是因为viewDidLayoutSubviews发生了变化,导致了循环的发生。我有 viewDidLayoutSubviews 和基本 UITableViewCells(无 Nib )的 <em>blank</em> 实现。然而在 iOS 11、Xcode 9.2 中,向上轻弹 tableview 会导致 viewDidLayoutSubviews 在无限循环中被调用。这是我的实现:</p>

<pre><code>- (void)viewDidLayoutSubviews {

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

<p>我终其一生都无法弄清楚这是怎么发生的。</p>

<p>编辑: Controller 有一个 NavigationController 并且是 UISplitViewController 的主 Controller ,它嵌入在 BannerViewController 中(来自 iAdSuite 示例)。</p>

<p>编辑:这发生在模拟器上所有设备的 iOS 11(直到 11.2)上。不会发生 iOS 10.3。 <code>viewDidLayoutSubviews</code> 在 iOS 10.3 中甚至没有被调用。当我简单地使用导航 Controller 和 UIViewController/TableView 代替 UISplitViewController/BannerViewController 时,我得到了相同的结果。所以似乎问题不是在那里引入的,而是来自 iOS 11 中正在发生的事情。</p>

<p>编辑:所以这很奇怪 - 似乎只有在为导航 Controller 选择大标题时才会发生这种情况!</p>

<pre><code>if (@available(iOS 11.0, *)) {
    self.navigationController.navigationBar.prefersLargeTitles = YES;
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAlways;
}
</code></pre>

<p>编辑:这个问题很容易重现。我下载了 Apple 的 iAd Suite 示例代码,并使用了 SplitNavigationController 项目。我更新了 iOS 11 的项目,包括更新 Storyboard以使用安全区域布局指南。我将 MasterViewController 从 UITableViewController 更改为带有 UITableView 的 UIViewController,我将其限制为 Storyboard 中的安全区域布局指南。我在 MasterViewController 中添加了 prefersLargeTitles 和 largeTitleDisplayMode。我在 viewDidLayoutSubviews 方法中添加了一个 NSLog 语句,因此可以很容易地观察到这种行为。我认为这是 iOS 11 的一个真正问题,我会尝试深入了解它,如果其他人可以提供任何想法或建议,我也将不胜感激。</p>

<p>编辑:matt 能够重现此问题并将其发布在 GitHub 项目中,可在以下链接中找到(感谢 matt!):<a href="http://github.com/mattneub/InfiniteLayoutSubviewsBug" rel="noreferrer noopener nofollow">InfiniteLayoutSubviewsBug</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><strong>编辑</strong>这绝对是 iOS 11 到至少 iOS 11.2 中的一个错误,但在 iOS 12 中该错误不再存在。</p>

<p>您似乎发现了一个错误。我能够在一个最小的示例项目中重现该问题,我已将其发布在 GitHub 上:</p>

<p> <a href="https://github.com/mattneub/InfiniteLayoutSubviewsBug" rel="noreferrer noopener nofollow">https://github.com/mattneub/InfiniteLayoutSubviewsBug</a> </p>

<p>下载项目并运行它。您将看到一个包含三行的简单表格。滚动表格 View <em>向上</em>然后松开。观察控制台。我们收到对 <code>viewDidLayoutSubviews</code> 的重复调用,每 1/60 秒一次,永远。</p>

<p>请注意,这<em>不是</em>由我们代码中的递归布局循环引起的。我的示例甚至没有调用 <code>super</code>。它所做的只是记录。这是 <em>runtime 本身</em> 一直重复调用 <code>viewDidLayoutSubviews</code>。发生这种情况时,没有我们的代码(除了 <code>print</code>)运行。</p>

<p>其他观察:</p>

<ul>
<li><p>正如您正确观察到的,如果您更改示例以使导航栏不使用大标题,问题就会消失。</p></li>
<li><p>如果您更改示例以便不使用自动布局定位表格 View ,问题就会消失。</p></li>
<li><p>如果您更改示例(更详细地),使 ViewController 成为 UITableViewController 子类,问题就消失了;我们得到了一些对 <code>viewDidLayoutSubviews</code> 的重复调用,但不是永远,只是在滚动时。</p></li>
</ul></p>
                                   
                                                <p style="font-size: 20px;">关于ios - viewDidLayoutSubviews 卡在空白方法的无限循环中,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47912392/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47912392/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - viewDidLayoutSubviews 卡在空白方法的无限循环中