MKMapView addAnnotation не добавляет аннотацию сразу

У меня есть следующий простой код:

self.departureAnnotation = [[UserAnnotation alloc] init];
self.departureAnnotation.coordinate = self.map.centerCoordinate;
[self.map addAnnotation:self.departureAnnotation];

[self.map selectAnnotation:self.departureAnnotation animated:YES];

Что этот код должен сделать (очевидно), так это добавить аннотацию к карте и сразу же выбрать ее.

Тем не менее, этот код на моем iPhone 4S без джейлбрейка под управлением iOS 5.1.1 не выбирает аннотацию (выноска не отображается), но это прекрасно работает в симуляторе iOS 6.

Чтобы исправить это, я сделал следующее, что в основном задерживает выбор вывода на 0,2 секунды, что мне не нравится:

self.departureAnnotation = [[UserAnnotation alloc] init];
self.departureAnnotation.coordinate = self.map.centerCoordinate;
[self.map addAnnotation:self.departureAnnotation];

[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(selectPin:) userInfo:self.departureAnnotation repeats:NO];

- (void)selectPin:(NSTimer *)timer
{
    [self.map selectAnnotation:timer.userInfo animated:YES];

}

Почему это происходит ?

PS: Кроме того, следуя тому же шаблону, если я проверю [self.map viewForAnnotation: self.departureAnnotation] вместо выбора булавки, представление будет нулевым. После этих 0,2 секунды задержки все в порядке.


person Nicu Surdu    schedule 23.11.2012    source источник


Ответы (2)


MKMapView, вероятно, необходимо завершить цикл выполнения, прежде чем он сможет предоставить вам представление аннотации/выбрать аннотацию. Если это так, не используйте таймер, отправьте свой selectAnnotation:animated: на следующий цикл цикла выполнения с помощью...

dispatch_async( dispatch_get_main_queue(), ^{
  [self.map selectAnnotation:self.departureAnnotation animated:YES];
} );

... наверное поможет.

Также в документации указано, что вам нужно сразу же добавлять аннотации, потому что MKMapView решает, какая аннотация будет на экране или нет, и, следовательно, возвращает для нее вид или нет.

Всего лишь мои 0,02 доллара...

person zrzka    schedule 23.11.2012
comment
Решение с dispatch_async не сработало. О добавлении аннотаций сразу: что, если данные, необходимые для построения аннотации, поступают из вызова сервера? - person Nicu Surdu; 23.11.2012

Это могло произойти из-за CATransaction(документов). CATransaction "собрать" все изменения, которые вы сделали на CALayers между состояниями begin и commit. Иногда, возможно, из-за неправильных методов программирования, бывает, что два метода "конфликтуют", обычно когда они асинхронны. У меня это произошло с помощью кнопок, например, когда вы активируете одну кнопку и одновременно хотите деактивировать другие. Я предполагаю, что другим решением может быть вызов
[self.map setNeedsDisplay];сразу после [self.map addAnnotation:self.departureAnnotation]; или использование этого фрагмента кода после того же метода:

id __weak weakSelf = (id)self; 
[CATransaction setCompletionBlock:^{[weakSelf.map selectAnnotation:weakSelf.departureAnnotation animated:YES];}];
person Andrea    schedule 23.11.2012
comment
Я вижу, как [self.map setNeedsDisplay] может заставить работать выбор, но я сомневаюсь в этом, потому что annotationView в этот момент равен нулю. Использование setCompletionBlock тоже не сработало: в этот момент вид все еще nill. - person Nicu Surdu; 23.11.2012
comment
Извините, я ошибся в предыдущем посте, я обновляю - person Andrea; 23.11.2012