Создание массива аннотаций для создания различных видов выносок на карте - PullRequest
0 голосов
/ 14 октября 2011

Я работаю с MapView и у меня есть 30 расположений контактов, и все работает отлично. Я добавил кнопку в выноску с RightCalloutAccessoryView. Вот код кнопки:

UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    pinView.rightCalloutAccessoryView = rightButton;
    [rightButton addTarget:self action:@selector(rightButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    return pinView;
}

Это работает нормально и вызывает метод rightButtonPressed. Вот реализация этого метода:

-(IBAction) rightButtonPressed:(id)sender
{
    NSLog(@"button clicked");
    MapViewController *thisMap = (MapViewController *)[[UIApplication sharedApplication] delegate];
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
    [thisMap switchViews:self.view toView:dvc.view];
}

Итак, как вы видите, всякий раз, когда я касаюсь любой кнопки из всех 30-контактных выносок, она переходит в один и тот же вид (DetailViewController). Я хочу, чтобы каждая кнопка имела свой собственный вид для переключения (это место, где я собираюсь разместить «Направления отсюда», «Направления отсюда» и т. Д., А также адрес и название магазина).

Я понимаю, что мог бы сделать 30 представлений и сделать 30 различных методов, которые могли бы применяться к каждому выводу, но я знаю, что должен быть более краткий код, который работает с массивами.

Возможно, определенные массивы могут быть вызваны в UILabel на DetailViewController, поэтому он просто загрузит соответствующую информацию и также даст указания для соответствующего местоположения.

Это может быть большой вопрос, и я искал несколько уроков, но не нашел ничего, что точно отвечает на вопрос. Если бы кто-нибудь мог заставить меня начать (или даже указать мне правильное направление), я был бы полностью благодарен.

1 Ответ

1 голос
/ 14 октября 2011

С аксессуарами выноски для аннотационного представления гораздо лучше использовать собственный метод делегата вида карты calloutAccessoryControlTapped для обработки нажатия кнопки вместо использования addTarget и собственного пользовательского метода.

В методе делегата calloutAccessoryControlTapped вы можете напрямую обращаться к аннотации, которая была нажата с помощью view.annotation, без необходимости выяснения, какая аннотация в массиве или какая-либо структура данных была использована.

Удалите вызов addTarget и замените метод rightButtonPressed: на:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
            calloutAccessoryControlTapped:(UIControl *)control
{
    //cast the plain view.annotation to your custom class so you can
    //easily access your custom annotation class' properties...
    YourAnnotationClass *annotationTapped = (YourAnnotationClass *)view.annotation;

    NSLog(@"button clicked on annotation %@", annotationTapped);

    MapViewController *thisMap = (MapViewController *)[[UIApplication sharedApplication] delegate];
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];

    //annotationTapped can be passed to the DetailViewController
    //or just the properties needed can be passed...
    //Example line below assumes you add a annotation property to DetailViewController.
    dvc.annotation = annotationTapped;

    [thisMap switchViews:self.view toView:dvc.view];
}
...