0

私のマップには多くのannotationViewがあり、それぞれに独自の画像があり、annotationViewのデータはデータベース内のさまざまなテーブルから取得されます。un'annotationViewを選択すると、別のviewControllerを表示したいので、これを行うには、文字列であるテーブル名を渡す必要があります。どうすればいいですか?試しましたが、次のエラーが発生します:

  No know instance method for selector 'setNameTable:'

これはMapViewController.mのコードです

  - (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id 
   <MKAnnotation>)annotation
  {
      //....

      if ([annotation isKindOfClass:[AnnotationCustom class]]){

       static NSString* AnnotationIdentifier = @"AnnotationIdentifier";

      MKPinAnnotationView *annotationView = (MKPinAnnotationView*) [mapView 
                   dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];


       annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                                  reuseIdentifier:AnnotationIdentifier];  

      if ([self.name isEqualToString:@"MyTable"]){

            if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
                annotationView.image = [UIImage imageNamed:@"iphone_myTable.png"];

               [annotationView.annotation setNameTable:[NSString 
                   stringWithFormat:self.name]]; //the error is here
               //nameTable is a property of AnnotationCustom class 


            }else{
                annotationView.image = [UIImage imageNamed:@"ipad_myTable.png"];

                [annotationView.annotation setNameTable:[NSString 
                   stringWithFormat:self.name]];//the error is here
                 //nameTable is a property of AnnotationCustom class 

            }

          //.......


       }

デリゲートメソッドでは、文字列を渡す必要があります

    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
    calloutAccessoryControlTapped:(UIControl *)control{

      AnnotationCustom *customAnnotation = (AnnotationCustom *)view.annotation;
     [customAnnotation setNameTable:[NSString stringWithFormat:@"%@",self.name]];

     NSLog(@"The name table is  %@",customAnnotation.nameTable); 
     /*the name is wrong, the string self.name is relative to last table open and not the 
      table  selected */


    }
4

3 に答える 3

0

私はなんとか問題を解決することができました。デリゲートメソッドのannotationViewにキャストを追加しました。

  - (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id 
  <MKAnnotation>)annotation
  {
          //....
        static NSString* AnnotationIdentifier = @"AnnotationIdentifier";

        MKPinAnnotationView *annotationView = (MKPinAnnotationView*) [mapView 
               dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];


       annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                              reuseIdentifier:AnnotationIdentifier];

       //I add in this position the cast
      AnnotationCustom *customAnnotation = (AnnotationCustom *)annotationView.annotation;

      if ([self.name isEqualToString:@"myTable"]){

            if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){
                annotationView.image = [UIImage imageNamed:@"iphone_myTable.png"];
                customAnnotation.nameTable = self.name; //I assign this the property


           }else{
                annotationView.image = [UIImage imageNamed:@"ipad_myTable.png"];
                customAnnotation.nameTable = self.name; //I assign this the property

            }
      }
           //.......
   }

別のデリゲートメソッドの場合:

   - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
        calloutAccessoryControlTapped:(UIControl *)control{

        AnnotationCustom *customAnnotation = (AnnotationCustom *)view.annotation;

        NSLog(@"The name Table is %@",customAnnotation.nameTable);      
        //the result is correct
     }
于 2012-11-09T12:21:11.020 に答える
0

annotationViewオブジェクトのannotationプロパティは、'nameTable'プロパティについて何も知らないクラスMKAnnotationです。

これを試して:

AnnotationCustom *annotationCustom= (AnnotationCustom *)annotation;
[annotationCustom setNameTable:[NSString stringWithFormat:self.name];
于 2012-11-08T15:54:56.443 に答える
0

キャストするとカスタムプロパティとメソッドにアクセスできますが、通常、デリゲートメソッドのオブジェクトにプロパティを設定したりメソッドを呼び出したりしないでください。annotationviewForAnnotation

プロパティをクラスインスタンスレベルの値( )に設定しようとしているため、その値が現在呼び出されているデリゲートメソッドとself.name同期しているという保証もありません。annotation

アノテーションを作成するとき、またはを呼び出す前に、アノテーションのプロパティを設定する必要があります。addAnnotationaddAnnotations

後で、デリゲートメソッド(などcalloutAccessoryControlTapped)で、キャストを使用してカスタムプロパティを再度取得できます。

于 2012-11-08T16:03:18.750 に答える