Включение и отключение перетаскивания аннотаций (на лету) (iOS Mapkit) - PullRequest
2 голосов
/ 03 апреля 2012

Я создал вид карты, в котором есть кнопка для переключения между режимом «редактирования» и режимом «перетаскивания» в зависимости от требований проекта.Я понимаю, что достаточно легко перетаскивать свои аннотации из создания, устанавливая их перетаскиваемыми в viewForAnnotation, но требуемое поведение этого не допустит.Я попробовал несколько разных способов изменить аннотации на перетаскиваемые без успехаПервой мыслью было перебрать существующие аннотации и установить для каждой из них «перетаскиваемый» и «выбранный», но я получил нераспознанный селектор, отправленный на ошибку экземпляра (я попытался создать новую аннотацию для передачи в объект и заново построить графикнаходясь в цикле, но я также получаю ту же ошибку):

NSLog(@"Array Size: %@", [NSString stringWithFormat:@"%i", [mapView.annotations count]]);

    for(int index = 0; index < [mapView.annotations count]; index++) {

        if([[mapView.annotations objectAtIndex:index]isKindOfClass:[locAnno class]]){
            NSLog(@"** Location Annotation at Index: %@", [NSString stringWithFormat:@"%i", index]);
            NSLog(@"* Location Marker: %@", [mapView.annotations objectAtIndex:index]);
        }

        if([[mapView.annotations objectAtIndex:index]isKindOfClass:[hydAnno class]]) {
            NSLog(@"** Hydrant Annotation at Index: %@", [NSString stringWithFormat:@"%i", index]);
            NSLog(@"* Hydrant Marker: %@", [mapView.annotations objectAtIndex:index]);

            [[mapView.annotations objectAtIndex:index]setSelected:YES];
            [[mapView.annotations objectAtIndex:index]setDraggable:YES];
        }
    }

Вторая мысль заключалась в том, чтобы использовать 'didSelectAnnotationView', устанавливать выбранные и перетаскиваемые на аннотацию, когда она выбрана, и сбрасывать свойствакогда режим снова переключается.Это работает, но очень плохо, так как событие не всегда срабатывает, и вам нужно нажать аннотацию один или несколько раз, прежде чем она изменит свойства:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
NSLog(@"Annotation Selected!");
if(!editMode) {
    view.selected = YES;
    view.draggable = YES;
}

}

Первыйпопытка кажется самым простым решением, если я смогу заставить его работать.Использование метода didSelect с другой стороны является громоздким и взломанным.Я довольно новичок в разработке для iOS, поэтому я прошу прощения, если я упустил из виду что-то новичка, пока разбираюсь с этим.Я ценю любую информацию, которую может предложить сообщество.Большое спасибо.

1 Ответ

3 голосов
/ 03 апреля 2012

Первый метод лучше, чем использование метода делегата didSelectAnnotationView.

Проблема с кодом, вызывающим ошибку «нераспознанный селектор», заключается в том, что он вызывает setSelected: и setDraggable: ваннотации объектов (тип id<MKAnnotation>) вместо соответствующих им MKAnnotationView объектов.У объектов id<MKAnnotation> нет таких методов, поэтому вы получаете ошибку «нераспознанный селектор».

Массив annotations представления карты содержит ссылки на объекты id<MKAnnotation> (модель данных), а неMKAnnotationView объекты для этих аннотаций.

Так что вам нужно изменить это:

[[mapView.annotations objectAtIndex:index]setSelected:YES];
[[mapView.annotations objectAtIndex:index]setDraggable:YES];

на что-то вроде этого:

//Declare a short-named local var to refer to the current annotation...
id<MKAnnotation> ann = [mapView.annotations objectAtIndex:index];

//MKAnnotationView has a "selected" property but the docs say not to set
//it directly.  Instead, call deselectAnnotation on the annotation...
[mapView deselectAnnotation:ann animated:NO];

//To update the draggable property on the annotation view, get the 
//annotation's current view using the viewForAnnotation method...
MKAnnotationView *av = [mapView viewForAnnotation:ann];
av.draggable = editMode;


Вы также должныобновите код в методе viewForAnnotation делегат , чтобы он также устанавливал draggable в editMode вместо жестко заданного YES или NO, чтобы при необходимости повторного просмотра карты-создайте представление для аннотации после того, как вы уже обновили его в цикле for, представление аннотации будет иметь правильное значение для draggable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...