Получение координат из раскрытия аннотации булавки, на кране

Я постараюсь сделать это очень просто:

Я очень плохо знаком с Objective-C (или программированием на самом деле), поэтому мне, вероятно, понадобится объяснение, а не просто ответ.

То, что я пытаюсь сделать и не могу сделать (пока): получить координату булавки после касания ее раскрытия и в конечном итоге передать ее через переход. Практически, я нажимаю свой значок "информация" на булавке, которую я только что создал, и я хотел бы видеть ее информацию на другой странице (веб-просмотр). Эта страница будет показывать координаты (и другие вещи, которые нам здесь не нужны).

Почему: На самом деле, я нажимаю на свой значок "информация" на аннотации булавки, созданной ранее пользователем, и я хотел бы видеть ее информацию на другой странице (веб-просмотр). Эта страница будет показывать координаты (и другие вещи, которые нам здесь не нужны).

Мои координаты булавки сохранены в

CLLocationCoordinate2D location;

Я не могу повторно использовать переменные, которые я использовал ранее, потому что они могут быть устаревшими (это будет работать, только если пользователь запросит последний созданный файл...) И я не знаю, как я могу получить координаты булавки; Должен быть метод или что-то, но я просто не могу его найти. Я нашел МНОГИЕ ответы в Интернете, и ни один из них, похоже, не работал, вероятно, потому, что я их не правильно понял. Во всяком случае, я не мог их использовать.

Я покажу вам немного моего кода, он довольно прост, я думаю:

Существует viewDidLoad, вы, вероятно, хотите увидеть его, я думаю:

- (void)viewDidLoad
{
    [super viewDidLoad];
    name = [[NSString alloc]init];
    detail = [[NSString alloc]init];
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longpressToGetLocation:)];
    lpgr.minimumPressDuration = 2.0;  //user must press for 2 seconds
    [_map addGestureRecognizer:lpgr];
    CLLocationCoordinate2D loc = CLLocationCoordinate2DMake(50.837863, 4.353616);
    MKCoordinateSpan span = MKCoordinateSpanMake(.035, .035);
    MKCoordinateRegion reg = MKCoordinateRegionMake(loc, span);
    self.map.region = reg;
    [self buildBaseAnno];
    self.map.showsUserLocation = true;
}

Я знаю, что это важно, но, честно говоря, я не до конца понимаю, как работает этот бит; Тем не менее, это работает.:D

    -(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView* v = nil;
    {
        static NSString* ident = @"Pin";
        v = [_map dequeueReusableAnnotationViewWithIdentifier:ident];
        if (v == nil)
        {
            v = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
            ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed;
            UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            v.rightCalloutAccessoryView = infoButton;
            v.centerOffset= CGPointMake(0,-20);
            v.canShowCallout= YES;
        }
        v.annotation = annotation;
    }
    return v;
}

Создание сенсорного пина:

- (void)longpressToGetLocation:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan)
        return;

    CGPoint touchPoint = [gestureRecognizer locationInView:self.map];
    location = [self.map convertPoint:touchPoint toCoordinateFromView:self.map];

    [self showAlertName];
}

Фактический метод создания аннотаций / выводов

-(void)buildAnno
{
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = location.latitude;
    coordinate.longitude = location.longitude;
    MKPointAnnotation* newann = [MKPointAnnotation new];
    newann.coordinate = coordinate;

    newann.title = name;
    newann.subtitle = detail;
    [self.map addAnnotation:newann];
}

Пожалуйста, скажите, если вам нужно больше кода; я не совсем уверен, что могу вам дать, так как мой код, вероятно, "правильный" (или порядочный), мне просто нужно знать, как получить нужную мне информацию (то есть координаты и другие данные из булавки, которую я только постучал.)

И я фактически не касаюсь булавки, я касаюсь раскрытия в аннотации булавки. Во всяком случае, этого пока достаточно!

Как только я смогу поймать эти координаты, я верю, что смогу передать их через последовательность, поскольку передача данных уже хорошо объяснена здесь, но если есть что-то "особенное", я был бы очень рад, если бы вы могли добавить его в Ваше объяснение, потому что мне все еще очень неудобно со всем этим, и большинство учебных пособий / руководств / ссылок, которые я нашел, на самом деле не помогли мне.

Большое спасибо за ваше время и помощь:)

(Изменить: я нашел подобный вопрос здесь, но я считаю, что мне нужна дополнительная помощь / объяснение.)

1 ответ

Решение

Вам не нужен распознаватель жестов - в протоколе делегата представления карты уже есть метод, который сообщает вам, когда был использован аксессуар выноски calloutAccessoryControlTapped и этот метод получает соответствующие annotationView, annotationView.annotation свойство возвращает вас к соответствующему объекту аннотации, а затем вы можете получить доступ к его coordinate свойство, чтобы получить координаты булавки.

Сначала создайте новое свойство в вашем классе:

 @property CLLocationCoordinate2D tappedCoord;

затем реализовать метод делегата

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    MKPointAnnotation *annotation=(MKPointAnnotation*)view.annotation;
    self.tappedcoord=annotation.coordinate;
    [self performSegueWithIdentifier:@"detailViewSegue"];   // Use your appropriate segue identifier
}

Тогда вы можете получить доступ к собственности в prepareForSegue (опять же, измените на соответствующее имя segue и класс контроллера представления назначения)

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"detailViewSegue" ]){
        DetailViewController *dvc=(DetailViewController *)segue.destinationViewController;
        dvc.coord=self.tappedCoord;
}

Кроме того, поскольку ваш MapView отображает местоположение пользователя, для этого будет аннотация. Вы должны указать это в своем viewForAnnotation метод, возвращающий ноль, если аннотация не одна из ваших. Вы можете проверить класс аннотации, чтобы определить это -

-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView* v = nil;
    if ([annotation isMemberOfClass:[MKPointAnnotation class]]) {
        static NSString* ident = @"Pin";
        v = [_map dequeueReusableAnnotationViewWithIdentifier:ident];
        if (v == nil)
        {
            v = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
            ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed;
            UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            v.rightCalloutAccessoryView = infoButton;
            v.centerOffset= CGPointMake(0,-20);
            v.canShowCallout= YES;
        }
        v.annotation = annotation;
    }
    return v;
}
Другие вопросы по тегам