Создание массива аннотаций для создания разных видов выноски на карте

#ios #arrays #mkmapview #callouts

#iOS #массивы #MKMapView #Выноски

Вопрос:

Я работаю с 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:

С аксессуарами для выноски вида аннотаций гораздо лучше использовать собственный метод делегирования вида карты 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];
}
  

Комментарии:

1. Отлично! Это намного проще, чем я думал (я все еще знакомлюсь с методами делегата представления карты). Единственная проблема, с которой я сталкиваюсь сейчас (которая у меня была и с моим предыдущим методом), заключается в том, что программа и все работает нормально, но в строке «[thisMap switchViews:self.view toView: dvc.view];» Выдает мне предупреждение о том, что «MapViewController» может не отвечать на «switchViews:toView:’даже если это так. Просто хочу прояснить это сейчас на случай, если это станет проблемой позже. Большое спасибо!

2. Убедитесь, что вы объявили метод switchViews в файле MapViewController.h (interface).

3. Я в замешательстве, поскольку метод switchViews вызывается в методе ‘- (void) MapView’, какой синтаксис для его объявления? Я знаю, как объявить метод самостоятельно, но как насчет чего-то подобного? (Извините! Я все еще учусь …)

4. Не имеет значения, откуда он вызывается. В предупреждении говорится, что MapViewController не объявил такой метод, поэтому его вызов может привести к сбою во время выполнения. В MapViewController.m у вас есть метод switchViews . Просто возьмите заголовок метода (например. -(void)switchViews:(UIView *)fromView toView:(UIView *)toView; ) и добавьте его в файл MapViewController.h перед @end .