Как обновить аннотацию без использования setCoordinate? - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть подкласс NSManagedObject, который соответствует протоколу MKAnnotation, и у него есть свойства NSNumber для широты и долготы.

Когда я сам изменяю любые координаты, я использую setCoordinate: и обновляю свойства широты и долготы внутриРеализация setCoordinate :.Используя этот метод, представление карты обновляет аннотации.Однако, когда я объединяю изменения с другим NSManagedObjectContext через mergeChangesFromContextDidSaveNotification :, setCoordinate: не используется, потому что свойства широты и долготы явно изменены.Это предотвращает любые уведомления KVO об изменении координат.

Я пытался получить представление карты, чтобы понять, что координата зависит от свойств широты и долготы с этим кодом:

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
    NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

    if ([@"coordinate" isEqualToString:key]) {
        NSSet *affectingKeys = [NSSet setWithObjects:@"latitude", @"longitude", nil];
        keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
    }

    return keyPaths;
}

Однако этот код вызывает это падение:

Завершение приложения из-за необработанного исключения «NSRangeException», причина: «Невозможно удалить наблюдателя для ключевого пути« координата », поскольку он не зарегистрирован в качестве наблюдателя.'

Любые идеи о том, как предотвратить этот сбой, или альтернативные методы получения координатного уведомления KVO, отправляемого при изменении широты или долготы?Спасибо, что заглянули.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Я исправил это, изменив setCoordinate:, чтобы он использовал примитивы доступа , которые автоматически генерируются Core Data для установки свойств latitude и longitude.

Подозреваю, что из-за того, что мой keyPathsForValuesAffectingValueForKey: сделал ключ coordinate зависимым от клавиш latitude и longitude, MKMapView запутался, когда setCoordinate: использовал общедоступные средства доступа вместо примитивных средств доступа .

Когда общедоступные методы доступа использовались для установки широты и долготы, любой объект, наблюдающий путь ключа coordinate, наблюдал три отдельных изменения (для путей ключа coordinate, latitude и longitude), когда там было только одно изменение (coordinate), которое должно наблюдаться, что запутало вид карты.

0 голосов
/ 21 февраля 2012

Это немного накладные расходы, но вы можете наблюдать за параметрами latitude и longitude (соответственно, переопределить их установщики) и принудительно устанавливать координаты (с помощью setCoordinate:) при изменении.

...