viewWillTransitionToSize 在 TabBarController 中调用错误的 ViewController

Posted

技术标签:

【中文标题】viewWillTransitionToSize 在 TabBarController 中调用错误的 ViewController【英文标题】:viewWillTransitionToSize Calls Wrong ViewController in TabBarController 【发布时间】:2017-02-24 03:01:25 【问题描述】:

我有带有 4 个视图控制器的 tabBarController 应用程序。这个应用程序启用了横向,所以我在每个 viewcontroller.m 文件中都有 viewWillTransitionToSize:(CGSize)size 和TransitionCoordinator:(id)coordinator 来控制方向变化。

我遇到的问题是,当我在第三个视图控制器中更改设备方向时,第二个视图控制器中的 viewWillTransitionToSize 被调用,因此运行了错误的代码。

第二个视图控制器的 viewWillTransitionToSize 怎么可能被调用?特别是,当它甚至还没有加载时。我知道它尚未加载,因为我 NSLog 它是 viewDidLoad 并且当我从第三个视图控制器更改方向时它会显示。

附加信息:第三个视图控制器的 viewWillTransitionToSize、viewWillAppear、viewWillDisappear 等中没有引用第二个视图控制器的代码。

我正在使用 Xcode 8.2.1 和 Objective-C 代码。请帮忙,谢谢。

【问题讨论】:

尝试添加相关代码(例如,尝试用最少的设置重新复制,可能只有 2 个视图控制器和一个标签栏控制器,没有故事板等) 尝试将其简化为重现问题的最小示例并将其放在 GitHub 上。 【参考方案1】:

在处理转换之前测试查看哪个UIViewController 是选定的UIViewController

在斯威夫特中:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

    guard self == tabBarController?.selectedViewController else  return 

    // handle transition here

在我的情况下,UIViewController 嵌入在 UINavigationController 中,所以我不得不稍微不同地处理它:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

    guard self.navigationController == tabBarController?.selectedViewController else  return 

    // handle transition here

【讨论】:

【参考方案2】:

我替换了

的每个实例
viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator 

willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

为了避免上述 viewWillTransitionToSize 问题...

【讨论】:

willAnimateRotationToInterfaceOrientation 已弃用,因此没有解决方案。 它完成了工作并且它没有在问题导航器上显示为问题。我也没有找到任何方法来获取 viewWillTransitionToSize... 触发它所在的每个视图控制器的每个 viewDidLoad。

以上是关于viewWillTransitionToSize 在 TabBarController 中调用错误的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

viewWillTransitionToSize:withTransitionCoordinator: 未调用

为啥 `viewWillTransitionToSize` 中检索 SafeAreaInsets 的逻辑略有错误?

ViewWillTransitionToSize 在 Swift 3 中出现故障?

viewWillTransitionToSize 返回 iPhone 12 pro max 的错误尺寸 [重复]

viewWillTransitionToSize:withTransitionCoordinator: 和 layoutSubviews: 之间的交互

Swift viewWillTransitionToSize 不使用分屏调用