3

iOS6 でうまく機能するアプリの構築を開始しましたが、その後、おろそかになるという理由で、IOS5 に切り替える必要がありました。しかし、私に問題を与え続けるマップがあります。このマップには、さまざまなタイプの annotationView (映画館、レストラン、劇場など) があり、それぞれに独自の画像があります。iOS6 から iOS5 に渡したとき、それらを構築するためのデリゲート メソッドの呼び出しが同じではないため、annotationView が以前と同じように動作しないことに気付きました。私に何ができる?

-(void)viewDidLoad{

     //.....
     //extraction of elements from the tables in a database

  for(int i=0; i<7; i++){ //extraction tables from database

    //......

    for (int i =0; i< number; i++) { //extraction elements from tables

        self.chinaTable =[self.mutableArray objectAtIndex:i];

         CLLocationCoordinate2D coord=CLLocationCoordinate2DMake(self.chinaTable.latitudine, self.chinaTable.longitudine);

        AnnotationCustom *annotationIcone =[[AnnotationCustom alloc]initWithCoordinates:coord title:self.chinaTable.titolo subTitle:self.chinaTable.indirizzo];

        //.......

        [self.mapView addAnnotation:annotation];

        self.locationManager.delegate = self;
        self.mapView.delegate=self; //the problem is here

   }

  }

デリゲート メソッド

  - (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id 
  <MKAnnotation>)annotation 
  {
        NSLog (@"the name of the table is %@", self.nomeTabella);
        // this NSLog you get only the name of the last open table

       //..........
       if ([annotation isKindOfClass:[AnnotationCustom class]]){
          static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
       MKAnnotationView *annotationView = (MKAnnotationView*) [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
       annotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
      annotationView.annotation = annotation;
      AnnotationCustom *customAnnotation = (AnnotationCustom *)annotationView.annotation;

     //I create an annotation different depending on the name of the table of provenance

     if ([self.nomeTabella isEqualToString:@"Cinema"]){
            if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
                annotationView.image = [UIImage imageNamed:@"iphone_cinema.png"];

                customAnnotation.nomeTabella = self.nomeTabella;
                customAnnotation.ID = self.chinaTable.ID;
                customAnnotation.china = self.chinaTable;

           }else{
                annotationView.image = [UIImage imageNamed:@"ipad_cinema.png"];
                customAnnotation.nomeTabella = self.nomeTabella;
                customAnnotation.ID = self.chinaTable.ID;
                customAnnotation.china=self.chinaTable;
            }

            //......

  }

デリゲート メソッドviewForAnnotationは、各アノテーションの構築後に呼び出されることはなくなりましたが、両方のサイクルの最後にのみ呼び出されるためannotationView、マップ上ではメモリ内の最後のテーブルのもののみが呼び出されます。以前と同じ結果を得るために set i delegate メソッドをどこで取得できますか? ViewForAnnotationiPad 6.0 シミュレーターでは正常に動作しますが、iPad シミュレーター 5.1 では動作せず、コードは同じです

4

3 に答える 3

4

viewForAnnotation各構築後にのみ呼び出されたと聞いて驚いています。それは文書化された方法ではなく、他の誰かが使用する方法でもありません。viewForAnnotationアプリ内の任意の時点で呼び出すことができます。ユーザーがマップをスクロールして一部の注釈が消えると、マップをスクロールして戻り、注釈が再表示​​されたときに呼び出すことができます。または、ユーザーが別のビューまたはアプリに切り替えてから戻ってきた場合。

そのビューの描画方法を決定できるプロパティviewForAnnotationの変数を確認する必要があります。annotation特定の順序で呼び出されることに依存することはできません。独自のクラスでプロトコルを実装する方法を示すサンプルコードがたくさんありますMKAnnotation。そのクラスに何かを追加して、それが表すものが映画館やレストランなどであるかどうかを伝えることができます。次に、適切な画像を取得します戻り値として望むにそれを入れMKAnnotationViewます。viewForAnnotation

于 2012-11-15T19:31:15.073 に答える
1

viewForAnnotationMKAnnotationmain にいるため、ループを実行しているとき (つまり、 each を追加するとき) は呼び出されませんrunLoopviewDidLoad終了してサイクルrunLoopが発生すると、 MKAnnotations (現在のマップの場所にあるもの) が画面に描画され、delegate. したがって、デバッグ中やステップ実行中は、メソッドviewDidLoadの呼び出しが表示されないのはまったく正常なことです。delegate

いくつかのこと:

  • ループの外側でデリゲート メソッドを設定する必要があります。したがってself.locationManager.delegate、ネストされたループ内で何百万回も設定するのではなく、ループのself.mapView.delegate前に設定する必要があります。for

  • i変数として再利用していfor...loopます。これは、実際のコードではなく、ここに投稿するためのビジネス ロジックを削除したことが原因であることを願っています。最後の注釈セットのみがレンダリングされているように見える理由を説明できます。

mapView.annotationsネストされたの他の場所を操作していませんfor...loopsか? removeAnnotationsおよび両方をチェックするとsetAnnotations:、 の注釈がmapView予想とは異なるものになる可能性があります。

annotationオブジェクトがどのように構築されているかを示すことができますか? もう 1 つの可能性は、新しいオブジェクトを作成するのではなく、誤って既存のオブジェクトを変更してしまうことです。

于 2012-11-21T06:12:15.220 に答える
1

あなたのコードは私には問題ないようです。実は私もマップを使ったiPhoneアプリを開発していて、あなたと同じようにやっています。1 つだけ質問があります。なぜ使用しているのですか。

if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone)

ユーザーがiPadまたはiPhoneを実行しているかどうかを確認するためですか?

于 2012-11-23T15:56:23.767 に答える