【问题标题】:Crash on rotation with modal segues使用模态序列旋转时崩溃
【发布时间】:2015-07-01 15:29:34
【问题描述】:

我有像这样链接的视图控制器 1、2 和 3,2 和 3 以模态序列呈现:

当用户处于横向模式一段时间(时间不一致),展开到父视图,然后将手机旋转回纵向时,应用程序崩溃并出现这些象征性的崩溃报告:

3 次展开为 2:

由于未捕获的异常而终止应用 'NSInvalidArgumentException',原因:'-[NSConcreteMutableData rotatesOnDeviceRotation]:发送到实例的无法识别的选择器 0x19360600'

Last Exception Backtrace
0   CoreFoundation  0x297a1fef  __exceptionPreprocess + 127
1   libobjc.A.dylib 0x37a53c8b  objc_exception_throw + 39
2   CoreFoundation  0x297a7409  __methodDescriptionForSelector + 1
3   CoreFoundation  0x297a5327  ___forwarding___ + 715
4   CoreFoundation  0x296d4e78  __forwarding_prep_0___ + 24
5   Retrostock v2   0x28b293    0x28b28f
6   CoreFoundation  0x29759e09  __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 13
7   CoreFoundation  0x296b4515  _CFXNotificationPost + 1785
8   Foundation  0x2a415749  -[NSNotificationCenter postNotificationName:object:userInfo:] + 73
9   UIKit   0x2cdf78b7  -[UIDevice setOrientation:animated:] + 319
10  UIKit   0x2cdf766b  -[UIApplication handleEvent:withNewEvent:] + 1599
11  UIKit   0x2cdf6f69  -[UIApplication sendEvent:] + 73
12  Retrostock v2   0x1ef675    -[IBGMethodSwizzler sendEvent:] (IBGMethodSwizzler.m:103)
13  Retrostock v2   0x1a850b    uvSendEvents (UVManager.m:162)
14  UIKit   0x2ce5cc81  _UIApplicationHandleEvent + 633
15  GraphicsServices    0x30f927d1  _PurpleEventCallback + 529
16  GraphicsServices    0x30f9241b  PurpleEventCallback + 35
17  CoreFoundation  0x297677cb  __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 35
18  CoreFoundation  0x29767767  __CFRunLoopDoSource1 + 347
19  CoreFoundation  0x29765d69  __CFRunLoopRun + 1609
20  CoreFoundation  0x296b2201  CFRunLoopRunSpecific + 477
21  CoreFoundation  0x296b2013  CFRunLoopRunInMode + 107
22  GraphicsServices    0x30f91201  GSEventRunModal + 137
23  UIKit   0x2ce56a59  UIApplicationMain + 1441
24  Retrostock v2   0x169690    main () (AppDelegate.swift:14)
25  libdyld.dylib   0x37fdfaaf  start + 3

Crashed Thread 0 :
    0   CoreFoundation  0x297a231f  __handleUncaughtException + 631
    1   libobjc.A.dylib 0x37a53f13  objc_terminate() + 175
    2   libc++abi.dylib 0x37388de3  std::__terminate() + 79
    3   libc++abi.dylib 0x373888af  __cxa_rethrow + 103
    4   libobjc.A.dylib 0x37a53dd3  objc_exception_rethrow + 43
    5   CoreFoundation  0x296b229d  CFRunLoopRunSpecific + 633
    6   CoreFoundation  0x296b2013  CFRunLoopRunInMode + 107
    7   GraphicsServices    0x30f91201  GSEventRunModal + 137
    8   UIKit   0x2ce56a59  UIApplicationMain + 1441
    9   Retrostock v2   0x169690    main () (AppDelegate.swift:14)
    10  libdyld.dylib   0x37fdfaaf  start + 3

2 展开为 1:

应用程序因信号 SIGSEGV 而崩溃

0   Retrostock v2   0x232293    0x23228f
1   CoreFoundation  0x29759e09  __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 13
2   CoreFoundation  0x296b4515  _CFXNotificationPost + 1785
3   Foundation  0x2a415749  -[NSNotificationCenter postNotificationName:object:userInfo:] + 73
4   UIKit   0x2cdf78b7  -[UIDevice setOrientation:animated:] + 319
5   UIKit   0x2cdf766b  -[UIApplication handleEvent:withNewEvent:] + 1599
6   UIKit   0x2cdf6f69  -[UIApplication sendEvent:] + 73
7   Retrostock v2   0x196675    -[IBGMethodSwizzler sendEvent:] (IBGMethodSwizzler.m:103)
8   Retrostock v2   0x14f50b    uvSendEvents (UVManager.m:162)
9   UIKit   0x2ce5cc81  _UIApplicationHandleEvent + 633
10  GraphicsServices    0x30f927d1  _PurpleEventCallback + 529
11  GraphicsServices    0x30f9241b  PurpleEventCallback + 35
12  CoreFoundation  0x297677cb  __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 35
13  CoreFoundation  0x29767767  __CFRunLoopDoSource1 + 347
14  CoreFoundation  0x29765d69  __CFRunLoopRun + 1609
15  CoreFoundation  0x296b2201  CFRunLoopRunSpecific + 477
16  CoreFoundation  0x296b2013  CFRunLoopRunInMode + 107
17  GraphicsServices    0x30f91201  GSEventRunModal + 137
18  UIKit   0x2ce56a59  UIApplicationMain + 1441
19  Retrostock v2   0x110690    main () (AppDelegate.swift:14)
20  libdyld.dylib   0x37fdfaaf  start + 3

我从 Appsee 获得这些报告,因为该应用现在处于 beta 测试阶段,我似乎无法在我自己的设备上重新创建错误,所以我依赖于在更新之前知道错误是什么。

应用似乎“忘记”了它所在的视图,并且不知道要旋转到哪个视图。如果您过去有任何想法或经历过类似的事情,我将不胜感激。

更新 1:

v2/ShinobiCharts.framework/Headers/SChartBandSeries.h:42:57:属性 属性“方向”的“只读”限制属性“读写” 从“SChartSeries”继承的属性

【问题讨论】:

  • 那么你有一个模态视图,它呈现一个模态视图,它呈现一个模态视图?当 pop(dismissViewControllerAnimated) 的设计目的时,我看不到从 3 到 2 放松的理由。展开通常是在导航堆栈中进一步向后导航。
  • @DCGoD 不,只有 2 和 3 以模态方式呈现。视图 1 是初始视图控制器。
  • 你不只是使用推送有什么原因吗?这是它设计的确切场景。在没有看到代码的情况下,我在这里唯一能想到的是,对第二个控制器的引用在通过 2 个模态展开后丢失了,所以当它尝试旋转该视图时它会崩溃。
  • @DCGoD 我确定我前段时间做出决定时是有原因的,但现在我不知道为什么,所以我会改回来,你认为模态序列导致问题?

标签: ios swift rotation modalviewcontroller uideviceorientation


【解决方案1】:

如果视图层次结构如此简单,那么您最好使用推送转场导航然后放松。如果没有看到代码,就不得不假设对第二个控制器的引用丢失了,因此在尝试旋转它时旋转会崩溃(尽管我没有经历过这种情况)。

或者只是简单地弹出一两个视图

self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
// Or to pop back 2
self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

更新:

您的问题是 Shonobicontrols 特有的。 https://www.shinobicontrols.com/forum/shinobicontrols/2014/3/app-terminated-on-rotation-in-[schartcanvas-viewabouttorotate]

我们最近修复了一个与释放后发送到 SChartCanvas 的消息相关的问题,该问题看起来与上述问题非常相似。 如果您看到此问题,版本 ShinobiCharts 2.7.3.hotfix2 可能值得尝试。这可从我们的门户网站下载。 我希望这可以解决您一直看到的问题,但如果问题仍然存在,请随时与我们联系! :-) 谢谢 瑞恩

【讨论】:

  • 展开和解散有什么区别?
  • 通常用于比这更深 1 个视图以及您想要触发操作的场景。没有必要使代码过于复杂,因此虽然 unwind 应该在这种情况下工作,但只需键入 dismissViewControllerAnimated 并使用 unwinds 来处理堆栈深处超过 2 个视图并想要展开并触发操作的情况要简单得多。跨度>
  • 直观意义是什么?当您关闭视图控制器时,您会将其从堆栈中弹出,而当您展开时,您究竟做了什么?另外,我记得为什么我一开始没有使用 push segue,当我使用它时,视图自动调整大小的行为很奇怪。
  • 展开是做同样的事情,将视图从堆栈中弹出到某个点。两者基本上都有一个完成处理程序。那么自动调整“奇怪”大小的视图可能是您的问题。我不得不想象你在某个地方遇到了约束问题。
  • 我得到的唯一错误来自我正在使用的自定义框架:ShinobiCharts,但我一直认为它在那里,因为我强迫它只停留在横向模式(3rd VC )。我已经在上面添加了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多