0

わかりました、私はこれを説明するために最善を尽くします。メソッド「searchBarSearchButtonClicked:」は、MKLocalSearch を提供するデータ ソースからシングルトン パターンにアクセスします。次に、共有インスタンスを使用して MapViewController にポイント アノテーションを設定します。これはすべて完璧に機能します。しかし、私が理解できないのは、任意のポイント注釈のタイトルからサファリ検索を実行する方法です。

注釈ビューにボタンがあります。そのボタンのアクション内で、サファリを開いて検索を実行できますが、検索は注釈のタイトルと一致しません。現在起こっていることは、マップ上に表示されているすべての関心のあるポイントにランダムな注釈のタイトルを追加することです。基本的に、ボタンは各関心ポイントにどのタイトルが対応するかを認識していません。

ユーザー ストーリー: たとえば、地図で「ピザ」を検索すると、そのユーザーの場所にある各ピザ レストランのピンが表示されます。注釈ビューでサファリ検索ボタンをタップすると、検索に追加される文字列はピザ レストランの名前の 1 つですが、クリックした注釈ビューと一致する名前ではありません。ドミノをクリックしたり、サファリで行われた小さなシーザーの両方の検索がピザハットとして戻ってくるとしましょう。私はここで問題を知っていますが、それを修正する方法についての手がかりがありません。

サファリ ボタン (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 とその機能について少し混乱しています。*annotation の -1 に関するコメントがあれば、お気軽にコメントしてください。新しいView ControllerとwebViewが検索を実行すると、さらに多くのことが起こります。

4

1 に答える 1

0

MKMapView は、.selectedAnnotations というプロパティを提供します。選択したタイトルを取得して文字列に追加するために、mapView でこれを呼び出すことができます。ここでは、それを使用して Web 検索を実行し、それを 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);
}

*annotation ステートメントの末尾にある -1 は、次のように機能します。

.selectedAnnotations は NSArray として宣言されているため、objectAtIndex を呼び出すことができます。インデックスはゼロベースで、最初のアイテムが 0 であることを意味します。カウントは 1 ベースで、最初のアイテムが 1 であることを意味します。したがって、1 ベースからゼロベースにシフトするには -1 が必要です。つまり、カウントとインデックスが一致する必要があります。

于 2015-07-13T18:29:27.500 に答える