Safari 从 MapView 中的任何给定点注释进行搜索

Safari Search From Any Given Point Annotation in MapView

好的,我将尽我所能解释这一点。 "searchBarSearchButtonClicked:" 方法从提供 MKLocalSearch 的数据源访问单例模式。然后我们使用共享实例在我们的 MapViewController 中设置点注释。所有这一切都完美无缺。但我无法弄清楚的是如何从任何给定点注释的标题 运行 进行 safari 搜索。

我的注释视图中有一个按钮。在该按钮的操作中,我能够打开 safari 和 运行 搜索,但搜索与注释标题不匹配。现在正在发生的事情是,它将随机注释标题附加到地图上显示的所有兴趣点。本质上,按钮并不知道每个兴趣点对应哪个标题。

用户故事: 所以说我 运行 在地图上搜索 "pizza",我得到了该用户位置周围每个比萨饼餐厅的 Pin 图。当我点击注释视图中的 safari 搜索按钮时,附加到搜索中的字符串是披萨餐厅名称之一,但它与我单击的注释视图不匹配。假设我点击了多米诺骨牌或小凯撒在 safari 中完成的两次搜索都会返回必胜客。我知道这里的问题,但我不知道如何解决它。

我在 safari 按钮 (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 有任何意见,请随时发表评论。一旦新的视图控制器和 webView 执行搜索,就会有更多。

MKMapView 提供了一个名为 .selectedAnnotations 的 属性。您可以在 mapView 上调用它以获得选定的标题,并将其附加到字符串中。在这里,我们将它用于 运行 网络搜索,并将其附加到 URL 字符串。

.selectedAnnotations 的 属性 声明看起来像这样:

@property(nonatomic, copy) NSArray *selectedAnnotations

属性 由 MKMapView 委托为您声明。换句话说,您不需要自己声明它。只需将消息发送到您的 mapView:self.mapView.selectedAnnotations,并确保您的 class 符合 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是这样的:

.selectedAnnotations 声明为 NSArray,因此我们可以在其上调用 objectAtIndex。索引是从零开始的,这意味着第一项是 0。计数是从一开始的,这意味着第一项是 1。因此需要 -1 才能从基于 1 的转变为基于零的。换句话说,计数和索引需要匹配。