2012-11-08 58 views
0

在我的地圖中有很多annotationView,每個annotationView都有自己的圖像, annotationView的數據取自數據庫中的不同表格。 當我選擇unannotationView我想顯示另一個viewController並做到這一點,我需要傳遞表名,這是一個字符串。我如何? 我試過,但我得到這個錯誤:將一個字符串傳遞給一個註解View

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 */ 


    } 

回答

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 
    } 
0

註釋屬性annotationView對象的類是MKAnnotation類,它不知道任何有關'nameTable'屬性的內容。

試試這個:

AnnotationCustom *annotationCustom= (AnnotationCustom *)annotation; 
[annotationCustom setNameTable:[NSString stringWithFormat:self.name]; 
+0

不再是同樣的錯誤,但選擇annotationView –

+0

有一個時候,我不能把這個字符串看看Anna Karenina上面的答案。註釋的屬性應該在創建時設置。 – NikosM

0

雖然鑄造會給您可以訪問自定義屬性和方法,您通常不應該設置屬性或調用在viewForAnnotation委託方法annotation對象的方法。

既然你也嘗試將資源設置爲某個類實例級值(self.name),但也沒有保證,它的價值是與annotation委託方法目前正在要求同步。

你應該做的是設置標註的屬性,當您創建註釋,並呼籲addAnnotationaddAnnotations之前。

之後,在委託方法(如calloutAccessoryControlTapped)中,您可以再次使用強制轉換檢索自定義屬性。

+0

我試圖用cast來檢索自定義屬性,但是名稱錯誤。該字符串相對於上次打開的表格而不是選定的表格。我添加了代碼來顯示 –

+0

我在viewDidLoad創建它時設置了customAnnotation的屬性,但在委託方法中不可見 –

+0

在委託方法中,不要調用setNameTable。只要閱讀財產。在創建註釋的地方顯示代碼。 – Anna

相關問題