Поиск Safari из любой заданной точки Аннотации в MapView

Хорошо, я сделаю все возможное, чтобы объяснить это. Метод «searchBarSearchButtonClicked:» обращается к одноэлементному шаблону из источника данных, который предоставляет MKLocalSearch. Затем мы настраиваем аннотации точек в нашем MapViewController, используя общий экземпляр. Все это прекрасно работает. Но я не могу понять, как запустить поиск сафари из заголовка аннотации любой точки.

У меня есть кнопка в моем представлении аннотации. В рамках действия этой кнопки я могу открыть сафари и запустить поиск, но поиск не соответствует заголовку аннотации. Что происходит прямо сейчас, так это то, что он добавляет случайный заголовок аннотации ко всем точкам интереса, отображаемым на карте. По сути, кнопка не знает, какой заголовок относится к каждой достопримечательности.

История пользователя: скажем, я запускаю поиск «пицца» на карте, я получаю булавки для каждой пиццерии в этом месте пользователя. Когда я нажимаю кнопку поиска сафари в представлении аннотации, строка, которая добавляется к поиску, является одним из названий пиццерий, но это не то имя, которое соответствует представлению аннотации, на которое я нажал. Скажем, я нажал на домино или маленького цезаря, и оба поиска, сделанные в сафари, вернутся как пиццерия. Я знаю проблему здесь, но я понятия не имею, как это исправить.

Код, который у меня есть в методе действия для кнопки сафари (leftButtonAnnotationPressed:), просто предназначен для тестирования, чтобы увидеть, какой вывод я получаю в консоли, когда нажимаю кнопку. И проблема заключается (я предполагаю) в *appendString. Это настолько подробно, насколько я могу получить, и, конечно же, код ниже. Вы заметите, что последний результат из журнала поиска карты добавляется к поиску, независимо от того, какое место вы нажимаете, в выходных данных метода leftButtonAnnoationPressed.

Аннотации

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    [self.searchBarMap resignFirstResponder];

[[DataSource sharedInstance] requestNewItemsWithText:self.searchBarMap.text withRegion:self.mapView.region completion:^{
    for (MKMapItem *items in [DataSource sharedInstance].matchingItems){
        self.pointAnnotation = [[MKPointAnnotation alloc] init];
        self.pointAnnotation.coordinate = items.placemark.coordinate;
        self.pointAnnotation.title = items.name;
        [self.mapView addAnnotation:self.pointAnnotation];
        self.storedItemNames = items.name;
        NSLog(@"%@", self.storedItemNames);
    }
  }];
}

Действие кнопки поиска Safari

-(void)leftButtonAnnotationPressed:(UIButton *)sender {
    NSString *appendString = self.pointAnnotation.title;
    NSString *urlString = @"http://www.google.com/search?q=";
    NSString *appendedUrlString = [urlString stringByAppendingString:appendString];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:appendedUrlString]];

    NSLog(@"%@", appendedUrlString);
}

Вывод из поиска по карте

2015-07-10 17:42:54.092 BlocSpot[1324:256489] Blondie's Pizza
2015-07-10 17:42:54.094 BlocSpot[1324:256489] Uncle Vito's Pizza
2015-07-10 17:42:54.096 BlocSpot[1324:256489] Zero Zero
2015-07-10 17:42:54.098 BlocSpot[1324:256489] Postrio
2015-07-10 17:42:54.100 BlocSpot[1324:256489] Cybelle's Pizza & Ice Cream
2015-07-10 17:42:54.102 BlocSpot[1324:256489] California Pizza Kitchen
2015-07-10 17:42:54.103 BlocSpot[1324:256489] zpizza
2015-07-10 17:42:54.105 BlocSpot[1324:256489] Pachino Trattoria & Pizzeria
2015-07-10 17:42:54.107 BlocSpot[1324:256489] Milan Pizza
2015-07-10 17:42:54.109 BlocSpot[1324:256489] Buca di Beppo Italian Restaurant

Вывод из leftButtonAnnotationPressed: (какая строка фактически добавляется)

2015-07-10 17:42:59.555 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant
2015-07-10 17:43:00.967 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant
2015-07-10 17:43:01.982 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant
2015-07-10 17:43:08.141 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant
2015-07-10 17:43:10.374 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant
2015-07-10 17:43:12.111 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant
2015-07-10 17:43:14.395 BlocSpot[1324:256489] http://www.google.com/search?q=Buca di Beppo Italian Restaurant

ОБНОВИТЬ

    MKPointAnnotation *annotation = [self.mapView.selectedAnnotations objectAtIndex:([self.mapView.selectedAnnotations count]) -1];
    NSString *appendString = annotation.title;
    NSString *urlString = @"http://www.google.com/search?q=";
    NSString *appendedUrlString = [urlString stringByAppendingString:appendString];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:appendedUrlString]];

    NSLog(@"appended string: %@", appendedUrlString);
}

Прогресс

MKPointAnnotation *annotation = [self.mapView.selectedAnnotations objectAtIndex:([self.mapView.selectedAnnotations count]) -1];
NSString *appendString = annotation.title;

Эта небольшая строка кода, кажется, делает свое дело. На данный момент я вывожу правильный вывод в консоль, так что все работает. Я немного запутался в -1 и в том, что он делает. Поэтому, если у кого-то есть какие-либо комментарии относительно -1 в аннотации *, пожалуйста, не стесняйтесь комментировать. Больше будет, когда новый контроллер представления и веб-представление выполнят поиск.


person Alex Blair    schedule 11.07.2015    source источник


Ответы (1)


MKMapView предоставляет свойство под названием .selectedAnnotations. Вы можете вызвать это в своем mapView, чтобы получить выбранный заголовок и добавить его в строку. Здесь мы используем его для запуска веб-поиска и добавляем его к строке URL.

Объявление свойства .selectedAnnotations выглядит примерно так:

@property(nonatomic, copy) NSArray *selectedAnnotations

Свойство объявляется для вас делегатом MKMapView. Другими словами, вам не нужно заявлять об этом самостоятельно. Просто отправьте сообщение в свой mapView: self.mapView.selectedAnnotations и убедитесь, что ваш класс соответствует MKMapViewDelegate.

MKPointAnnotation *annotation = [self.mapView.selectedAnnotations objectAtIndex:([self.mapView.selectedAnnotations count]) -1];
NSString *appendString = annotation.title;
NSString *urlString = @"http://www.google.com/search?q=";
NSString *appendedUrlString = [urlString stringByAppendingString:appendString];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:appendedUrlString]];

NSLog(@"appended string: %@", appendedUrlString);
}

-1 в конце инструкции *annotation работает следующим образом:

.selectedAnnotations объявлен как NSArray, поэтому мы можем вызвать для него objectAtIndex. Индекс основан на нуле, что означает, что первый элемент равен 0. Счетчик основан на единице, что означает, что первый элемент равен 1. Таким образом, -1 необходим для перехода от 1 к нулю. Другими словами, количество и индекс должны совпадать.

person Alex Blair    schedule 13.07.2015