iOS - 从导航控制器推送时应用程序冻结
Posted
技术标签:
【中文标题】iOS - 从导航控制器推送时应用程序冻结【英文标题】:iOS - App freezes when push from navigation controller 【发布时间】:2017-07-03 09:54:48 【问题描述】:我遇到了这个奇怪的错误:有时当我推送视图控制器(VC1 -> VC2)时,应用程序被冻结(它不会崩溃,只是冻结)。没有阻塞主线程。当我检查 View Hierarchy 时,VC2 实际上位于“UIParallaxDimmingView
”之下。此外,还调用了viewDidLoad
、viewDidAppear
。
我如何呈现 VC2:
VC *vc2 = [[VC alloc]initWithStyle:UITableViewStyleGrouped];
[self.navigationController pushViewController:vc2 animated:YES];
所以问题是 VC2 已加载但未出现在屏幕上。这是视图层次结构的屏幕截图,突出显示的蓝色视图是UIParallaxDimmingView
,它阻塞了我所有的VC2内容,而VC1实际上在VC2下面......
这是我的堆栈跟踪
0x10016b8dc <+0>: sub sp, sp, #0x40 ; =0x40
0x10016b8e0 <+4>: stp x29, x30, [sp, #0x30]
0x10016b8e4 <+8>: add x29, sp, #0x30 ; =0x30
0x10016b8e8 <+12>: stur wzr, [x29, #-0x4]
0x10016b8ec <+16>: stur w0, [x29, #-0x8]
0x10016b8f0 <+20>: stur x1, [x29, #-0x10]
0x10016b8f4 <+24>: bl 0x1004105a4 ; symbol stub for: objc_autoreleasePoolPush
0x10016b8f8 <+28>: adrp x1, 1044
0x10016b8fc <+32>: add x1, x1, #0x888 ; =0x888
0x10016b900 <+36>: adrp x30, 1057
0x10016b904 <+40>: add x30, x30, #0xd70 ; =0xd70
0x10016b908 <+44>: ldur w8, [x29, #-0x8]
0x10016b90c <+48>: ldur x9, [x29, #-0x10]
0x10016b910 <+52>: ldr x30, [x30]
0x10016b914 <+56>: ldr x1, [x1]
0x10016b918 <+60>: str x0, [sp, #0x18]
0x10016b91c <+64>: mov x0, x30
0x10016b920 <+68>: str w8, [sp, #0x14]
0x10016b924 <+72>: str x9, [sp, #0x8]
0x10016b928 <+76>: bl 0x1004106c4 ; symbol stub for: objc_msgSend
0x10016b92c <+80>: bl 0x10040fc20 ; symbol stub for: NSStringFromClass
0x10016b930 <+84>: mov x29, x29
0x10016b934 <+88>: bl 0x100410718 ; symbol stub for: objc_retainAutoreleasedReturnValue
0x10016b938 <+92>: mov x9, #0x0
0x10016b93c <+96>: ldr w8, [sp, #0x14]
0x10016b940 <+100>: str x0, [sp]
0x10016b944 <+104>: mov x0, x8
0x10016b948 <+108>: ldr x1, [sp, #0x8]
0x10016b94c <+112>: mov x2, x9
0x10016b950 <+116>: ldr x3, [sp]
0x10016b954 <+120>: bl 0x10040fd28 ; symbol stub for: UIApplicationMain
0x10016b958 <+124>: stur w0, [x29, #-0x4]
0x10016b95c <+128>: ldr x1, [sp]
0x10016b960 <+132>: mov x0, x1
0x10016b964 <+136>: bl 0x1004106e8 ; symbol stub for: objc_release
0x10016b968 <+140>: ldr x0, [sp, #0x18]
0x10016b96c <+144>: bl 0x100410598 ; symbol stub for: objc_autoreleasePoolPop
0x10016b970 <+148>: ldur w0, [x29, #-0x4]
0x10016b974 <+152>: ldp x29, x30, [sp, #0x30]
0x10016b978 <+156>: add sp, sp, #0x40 ; =0x40
0x10016b97c <+160>: ret`
【问题讨论】:
如何加载 VC2?代码 sn-p? 你检查过CPU了吗? @HashmatKhalil 请看我更新的问题,只是正常的方式,没什么特别的 可能需要分享VC2的init方法,加上-viewDidLoad
、-viewWillAppear:
和-viewDidAppear:
。如果您在那里没有做任何有趣或不寻常的事情,这听起来像是一个操作系统错误,但似乎不太可能发生。
@SeamusCampbell 我没有做任何可能影响 UI 的事情,我认为这是一个 ios 错误,因为有趣的是:当它冻结时,我按下主页按钮返回主屏幕,然后回到应用程序,VC2 就像正常的一样。所以肯定没有什么阻塞主线程。好奇怪。
【参考方案1】:
我设法找到了解决方案here
所以即使当前可见视图控制器是导航堆栈上唯一的 VC,我的 interactivePopGestureRecognizer
也已启用。只需禁用它即可解决错误。
【讨论】:
【参考方案2】:SWIFT 3
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool)
if (navigationController.viewControllers.count > 1)
self.navigationController?.interactivePopGestureRecognizer?.delegate = self
navigationController.interactivePopGestureRecognizer?.isEnabled = true;
else
self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
navigationController.interactivePopGestureRecognizer?.isEnabled = false;
【讨论】:
以上是关于iOS - 从导航控制器推送时应用程序冻结的主要内容,如果未能解决你的问题,请参考以下文章
如何从 NSObject 类获取导航控制器并在 ios 中推送视图控制器