2011-10-14 43 views
0

我正在使用MapView,並且放置了30個針位置,並且一切都很好。我使用rightCalloutAccessoryView在標註中添加了一個按鈕。這裏的按鈕代碼:創建註釋數組以便在地圖上製作不同的標註視圖

UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    pinView.rightCalloutAccessoryView = rightButton; 
    [rightButton addTarget:self action:@selector(rightButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    return pinView; 
} 

這工作正常,並調用「rightButtonPressed」方法。下面是方法的實現:

-(IBAction) rightButtonPressed:(id)sender 
{ 
    NSLog(@"button clicked"); 
    MapViewController *thisMap = (MapViewController *)[[UIApplication sharedApplication] delegate]; 
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil]; 
    [thisMap switchViews:self.view toView:dvc.view]; 
} 

所以,你看,任何時候我觸碰任何一個按鈕從所有30個引腳標註,它進入了同樣的觀點(DetailViewController)。我希望每個按鈕都有它自己的視圖來切換到(這是我要放置「到這裏的路線」和「來自這裏的路線」等位置以及商店地址和名稱的位置)。

我意識到我可以製作30個視圖並製作30種適用於每個引腳的不同方法,但我知道必須有一個更簡潔的代碼來處理數組。

可能的某些數組可以在DetailViewController的UILabel中調用,因此它只會加載適當的信息並指示相應的位置。

這可能是一個很大的問題,我已經四處尋找一些教程,但沒有找到任何確切回答問題的東西。如果有人能讓我開始(或者甚至指向正確的方向),我會非常感激。

回答

1

隨着標註視圖標註配件,這是更好的使用地圖視圖自己的委託方法calloutAccessoryControlTapped來處理,而不是使用addTarget和自己的自定義方法按下按鈕。

calloutAccessoryControlTapped委託方法中,您可以直接訪問使用view.annotation輕敲的註釋,而無需確定數組中的哪個註釋或任何數據結構被輕敲。

刪除調用addTarget與更換rightButtonPressed:方法:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
      calloutAccessoryControlTapped:(UIControl *)control 
{ 
    //cast the plain view.annotation to your custom class so you can 
    //easily access your custom annotation class' properties... 
    YourAnnotationClass *annotationTapped = (YourAnnotationClass *)view.annotation; 

    NSLog(@"button clicked on annotation %@", annotationTapped); 

    MapViewController *thisMap = (MapViewController *)[[UIApplication sharedApplication] delegate]; 
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil]; 

    //annotationTapped can be passed to the DetailViewController 
    //or just the properties needed can be passed... 
    //Example line below assumes you add a annotation property to DetailViewController. 
    dvc.annotation = annotationTapped; 

    [thisMap switchViews:self.view toView:dvc.view]; 
} 
+0

太好了!這比我想象的要容易得多(我仍然讓自己熟悉地圖視圖委託的方法)。我現在擁有的一個問題(我以前的方法也是這樣)是程序和一切正常,但在'[thisMap switchViews:self.view toView:dvc.view]'這行';'它給了我一個警告,即''MapViewController'可能不會響應'switchViews:toView:',即使它有。現在只想清除它,以防它稍後成爲問題。非常感謝! – MillerMedia

+0

確保您在MapViewController.h(接口)文件中聲明瞭switchViews方法。 – Anna

+0

自從switchViews方法在' - (void)mapView'方法中被調用後,我很困惑,聲明它的語法是什麼?我知道如何在自己的方法上聲明一個方法,但是這樣的事情呢? (對不起,我仍然在學習......) – MillerMedia