仅当它是iOS 7且包含spcluster自定义映射( super 引脚映射)时,才出现此错误。为什么会发生此错误,我该如何解决?

 *** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <MKMapAnnotationManager 0xb355a00> for the key path "coordinate" from <Annotation 0x194c1470> because it is not registered as an observer.'

最佳答案

我有这个完全相同的问题。

您可以通过执行此操作来解决。

  • 创建MKAnnotation的子类,或将以下内容添加到现有的子类中。
  • 在其中添加一个变量(这在Swift中,但您也可以为ObjC解释):
  •     var observers: NSMutableSet! = NSMutableSet()
    
  • 然后,添加以下方法:
  •     override func addObserver(observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions, context: UnsafeMutablePointer) {
            let observerId : String = "\(observer.hashValue)\(keyPath)"
    
            self.observers.addObject(observerId)
            super.addObserver(observer, forKeyPath: keyPath, options: options, context: context)
        }
    
        override func removeObserver(observer: NSObject, forKeyPath keyPath: String) {
    
            let observerId : String = "\(observer.hashValue)\(keyPath)"
    
            if (self.observers.containsObject(observerId)) {
                self.observers.removeObject(observerId)
                super.removeObserver(observer, forKeyPath: keyPath)
            }
        }
    
  • 将此子类与MKMapView一起使用。

  • 为了进行调试,如果在removeObserver()的else块内添加“NSLog”语句,您会发现MKMapView(或它的MKAnnotationManager)偶尔会随机决定删除对已被要求观察的MKAnnotation的观察。根据Apple自己的KVO文档,这是不可行的。

    当它们跟踪(在每个注释的基础上)已为每个注释注册了哪些观察结果时,这些优先事项将“解决”该问题,从而使您可以拒绝取消观察已经被取消观察(或从未被观察到)的内容。首先观察到)。

    这很麻烦,但是他们修复了我的动画崩溃。而且这样做没有太多的性能开销。

    关于ios - 是什么导致引发此异常 "observer error"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20176890/

    10-11 19:52