#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 .