iOS14关于UINavigationController在po
2020-12-07 本文已影响0人
双鱼子曰1987
一、问题现象
旧工程项目中,通过swizzling 控制器的 UIViewController
的viewWillAppear:
和 viewWillDisappear:
两个方法,在方法里面做Tabbar的隐藏控制逻辑。
在升级iOS14中,系统为iOS14.1的iPhoneXS手机上面,使用XCode12编译的包,在控制器采用popToViewController:
回上上个页面的时候,Tabbar没办法隐藏;而XCode11编译的包正常。
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:1];
[self.navigationController popToViewController:vc animated:YES];
这个问题属于iOS14适配的问题,猜测应该是iOS14-SDK的针对UINavigationController
做了优化,导致行为发生变化。
二、问题分析
举例说明:C_ViewController PopTo A_ViewController
- XCode 12编译(即iOSSDK 14)
2020-12-04 15:08:22.665901+0800 demo[510:73633]
C_ViewController viewWillDisappear:
(
"<C_ViewController: 0x104a0e5a0>",
"<Main_ViewController: 0x104a06c30>",
"<A_ViewController: 0x103706290>"
)
2020-12-04 15:08:22.666289+0800 demo[510:73633]
A_ViewController viewWillAppear:
(
"<C_ViewController: 0x104a0e5a0>",
"<Main_ViewController: 0x104a06c30>",
"<A_ViewController: 0x103706290>"
)
2020-12-04 15:08:23.187179+0800 demo[510:73633]
C_ViewController viewDidDisappear:
(null)
2020-12-04 15:08:23.187772+0800 demo[510:73633]
A_ViewController viewDidAppear:
(
"<Main_ViewController: 0x104a06c30>",
"<A_ViewController: 0x103706290>"
)
- XCode 11编译(即iOSSDK 14 之前)
2020-12-04 15:10:20.826391+0800 demo[514:74952]
C_ViewController viewWillDisappear:
(null)
2020-12-04 15:10:20.826904+0800 demo[514:74952]
A_ViewController viewWillAppear:
(
"<Main_ViewController: 0x103b04720>",
"<A_ViewController: 0x103c0aaf0>"
)
2020-12-04 15:10:21.346241+0800 demo[514:74952]
C_ViewController viewDidDisappear:
(null)
2020-12-04 15:10:21.346823+0800 demo[514:74952]
A_ViewController viewDidAppear:
(
"<Main_ViewController: 0x103b04720>",
"<A_ViewController: 0x103c0aaf0>"
)
iOS14之前,页面消失的时候,self.navigationController被置为nil,并且已经从VC栈中移除;而在iOS14上面,会先移动到栈底部,self.navigationController还没有置为nil,系统后续在释放。
- 导致的问题
当有的项目中,使用method swizzling的viewWillAppear
和viewWillDisappear
,根据self.navigationController.viewControllers
来做判断逻辑的时候,就会出现问题。例如使用其来做底部Tabbar的隐藏和消失的时候,在XCode12编译的包和XCode11编译的包不同,出现问题。
三、问题解决方案探讨
通过对比发现 C_ViewController.navigationController
会在C_ViewController. viewDidDisappear
回调之前被销毁,因此这里面判断Tabbar的隐藏逻辑,可以临时解决该问题。
最终的方案,还是实现UINavigationController
的代理方法,里面去设置Tabbar的问题。
注意:
- 发现在
[self.navigationController popToRootViewControllerAnimated:YES];
也存在上面的逻辑修改