gpt4 book ai didi

ios - viewDidLayoutSubviews 陷入空白方法的无限循环

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:53:35 28 4
gpt4 key购买 nike

我有一个在 UIStoryboard 中使用 UITableView 设置的 View Controller 。 UITableView 在所有四个边上都被限制在 Controller 的 SafeArea 中。

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

- (void)viewDidLayoutSubviews {

NSLog(@"viewDidLayoutSubviews");
[super viewDidLayoutSubviews];
}

我一辈子都弄不明白这是怎么回事。

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

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

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

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

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

编辑:matt 能够重现此问题并将其发布在 GitHub 项目中,可在以下链接中找到(感谢 matt!):InfiniteLayoutSubviewsBug

最佳答案

编辑这绝对是 iOS 11 至至少 iOS 11.2 中的一个错误,但在 iOS 12 中该错误不再存在。

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

https://github.com/mattneub/InfiniteLayoutSubviewsBug

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

请注意,这不是是由我们代码中的递归布局循环引起的。我的示例甚至没有调用 super。它所做的只是记录。这是运行时本身永远重复调用viewDidLayoutSubviews。发生这种情况时,我们的任何代码(print 除外)都不会运行。

其他观察:

  • 正如您正确观察到的那样,如果您更改示例以使导航栏不使用大标题,问题就会消失。

  • 如果您更改示例以便表格 View 不使用自动布局定位,问题就会消失。

  • 如果您更改示例(更详细地)以便 View Controller 是 UITableViewController 的子类,问题就会消失;我们收到一些对 viewDidLayoutSubviews 的重复调用,但不是永远,只是在滚动时。

关于ios - viewDidLayoutSubviews 陷入空白方法的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47912392/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com