无法识别的选择器isPitched被调用

时间:2015-02-28 13:19:55

标签: ios objective-c mapkit selector

在我的应用程序中,我正在显示带注释的地图,用户可以在表格视图中浏览注释列表(在模态视图控制器中)。

我遇到了一个奇怪的错误,我可以在设备和模拟器(iOS 7& 8)中重现。

当处于投球模式时,如果我尝试在我的POI表视图中选择一个项目,它会执行以下操作之一:

  • 将地图中心更改为地图上的随机点,而不是选定的注释。
  • 崩溃了我放入的消息(启用了NSZombies)。
  

- [__ NSCFString isPitched]:无法识别的选择器发送到实例0x7f24e6e0

我尝试了几种方法来解决这个问题,但没有成功。令我困惑的是,我无法找到有关isPitched方法的任何信息。它不在我的代码中,也不在Apple文档中。

有人对MapKit和这些类型的问题有更多了解吗? 或者,当用户在列表中选择POI时,您是否知道停用音高的方法?也许它可以防止这个错误。

screenshot

编辑:刚刚发现' isPitched'方法实际上是VectorKit的一部分!但是,它并没有真正帮助。没有关于VectorKit的文档...

编辑2:添加了堆栈跟踪。

-[__NSCFString isPitched]: unrecognized selector sent to instance 0x7db84870
2015-02-28 14:25:08.501 Cartel 2015[2481:178443] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString isPitched]: unrecognized selector sent to instance 0x7db84870'
*** First throw call stack:
(
    0   CoreFoundation                      0x00afb946 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x00784a97 objc_exception_throw + 44
    2   CoreFoundation                      0x00b035c5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
    3   CoreFoundation                      0x00a4c3e7 ___forwarding___ + 1047
    4   CoreFoundation                      0x00a4bfae _CF_forwarding_prep_0 + 14
    5   VectorKit                           0x02dd09c1 __86-[VKMapCameraController _animateToPosition:pitch:yaw:duration:timingCurve:completion:]_block_invoke + 1809
    6   VectorKit                           0x02d88645 -[VKAnimation onTimerFired:] + 357
    7   VectorKit                           0x02d9895e -[VKScreenCanvas animateWithTimestamp:] + 686
    8   VectorKit                           0x02d9850e -[VKScreenCanvas updateWithTimestamp:] + 46
    9   VectorKit                           0x02d71e69 -[VKMapView onTimerFired:] + 89
    10  libobjc.A.dylib                     0x0079a771 -[NSObject performSelector:withObject:] + 70
    11  VectorKit                           0x0323463c -[GGLDisplayLink _displayLinkFired:] + 60
    12  QuartzCore                          0x041abcad _ZN2CA7Display15DisplayLinkItem8dispatchEv + 45
    13  QuartzCore                          0x041abb83 _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 311
    14  QuartzCore                          0x041ac067 _ZN2CA7Display16TimerDisplayLink8callbackEP16__CFRunLoopTimerPv + 123
    15  CoreFoundation                      0x00a558d6 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    16  CoreFoundation                      0x00a5525d __CFRunLoopDoTimer + 1309
    17  CoreFoundation                      0x00a146ba __CFRunLoopRun + 2090
    18  CoreFoundation                      0x00a13bcb CFRunLoopRunSpecific + 443
    19  CoreFoundation                      0x00a139fb CFRunLoopRunInMode + 123
    20  GraphicsServices                    0x03f4324f GSEventRunModal + 192
    21  GraphicsServices                    0x03f4308c GSEventRun + 104
    22  UIKit                               0x00f318b6 UIApplicationMain + 1526
    23  Cartel 2015                         0x0001110d main + 141
    24  libdyld.dylib                       0x046aaac9 start + 1
    25  ???                                 0x00000001 0x0 + 1

1 个答案:

答案 0 :(得分:2)

好的,我设法通过以下修复来防止崩溃。

当在我的列表中选择POI时,我触发视图控制器的委托方法,该方法从tableView的控制器的didSelect方法处理MapView。如果你遇到同样的问题,我认为你到目前为止理解我的意思。

在这种方法中,我要求MapView将自己置于POI的坐标上。

现在,要解决仅在用户跟踪模式被设置为" pitched" (按照您的方向),我只需在方法开头添加一行来停用此跟踪模式:

[mapView setUserTrackingMode: MKUserTrackingModeNone] ;

这消除了随机出现的崩溃。请注意,它不会导致违反直觉的行为,因为当用户移动地图时,此跟踪模式会自动停用。

所以问题对我来说已经解决了,但是如果你有关于这个isPitched选择器的任何信息以及真正导致问题的原因,那么非常欢迎你在这里发布!