2014-05-14 37 views
2

我會盡力保持這個很簡單:從管腳的註解披露獲取座標,自來水

我很新的Objective-C(或編程實際上),所以我可能會需要一個解釋不止只是一個答案。

我想要做和不能做什麼(還): 獲取點擊它的信息披露後,銷的協調,並最終通過它通過SEGUE。 實際上,我點擊了我剛剛創建的針上的「信息」圖標,並且希望看到它是另一個頁面(網絡視圖)中的信息。此頁面將顯示座標(以及我們在此不需要的其他內容)。

爲什麼: 實際上,我點擊用戶之前創建一個引腳的註解我的「信息」圖標,我想看看它在另一個網頁(網頁視圖)的信息。此頁面將顯示座標(以及我們在此不需要的其他內容)。

我銷座標被存儲到

CLLocationCoordinate2D位置;

我不能再次使用,因爲它們可能已過時我之前使用的變量(如果用戶要求創建的最後一個...它只會工作) 我不知道我可以得到一個pin的座標;必須有一種方法或某種東西,但我只是找不到它。我在網上找到很多答案,而且似乎沒有任何工作,可能是因爲我沒有正確理解它們。無論如何,我無法使用它們。

我會告訴你我的代碼位,這是很簡單的我猜:

還有就是viewDidLoad中,你可能想看到它,我想:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    name = [[NSString alloc]init]; 
    detail = [[NSString alloc]init]; 
    UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longpressToGetLocation:)]; 
    lpgr.minimumPressDuration = 2.0; //user must press for 2 seconds 
    [_map addGestureRecognizer:lpgr]; 
    CLLocationCoordinate2D loc = CLLocationCoordinate2DMake(50.837863, 4.353616); 
    MKCoordinateSpan span = MKCoordinateSpanMake(.035, .035); 
    MKCoordinateRegion reg = MKCoordinateRegionMake(loc, span); 
    self.map.region = reg; 
    [self buildBaseAnno]; 
    self.map.showsUserLocation = true; 
} 

我知道這很重要,但說實話,我不完全理解這個位是如何工作的;但它仍然有效。 :d

-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKAnnotationView* v = nil; 
    { 
     static NSString* ident = @"Pin"; 
     v = [_map dequeueReusableAnnotationViewWithIdentifier:ident]; 
     if (v == nil) 
     { 
      v = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident]; 
      ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed; 
      UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      v.rightCalloutAccessoryView = infoButton; 
      v.centerOffset= CGPointMake(0,-20); 
      v.canShowCallout= YES; 
     } 
     v.annotation = annotation; 
    } 
    return v; 
} 

觸針創建:

- (void)longpressToGetLocation:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) 
     return; 

    CGPoint touchPoint = [gestureRecognizer locationInView:self.map]; 
    location = [self.map convertPoint:touchPoint toCoordinateFromView:self.map]; 

    [self showAlertName]; 
} 

實際的註解/針的創建方法

-(void)buildAnno 
{ 
    CLLocationCoordinate2D coordinate; 
    coordinate.latitude = location.latitude; 
    coordinate.longitude = location.longitude; 
    MKPointAnnotation* newann = [MKPointAnnotation new]; 
    newann.coordinate = coordinate; 

    newann.title = name; 
    newann.subtitle = detail; 
    [self.map addAnnotation:newann]; 
} 

請你告訴我們,如果你需要更多的代碼;我不確定我可以給你什麼,因爲我的代碼可能是'正確的'(或體面的),我只需要真正知道如何獲得我需要的信息(也就是座標和其他東西只是點擊。)

而我實際上不點擊引腳,我點擊引腳的註釋披露。無論如何,這就夠了!

一旦我可以捕捉到這些座標,我相信我將能夠通過它們傳遞數據,因爲傳遞數據已經在這裏得到了很好的解釋,但是如果有什麼'特殊'的話,我會很高興可以將它添加到你的解釋中,因爲我仍然對這一切感到非常不舒服,而且我發現的大多數教程/指南/鏈接都沒有真正幫助我。

非常感謝您的時間和幫助:)

(編輯:我發現了一個類似的問題here但我相信我需要額外的幫助/解釋。)

回答

1

你不需要手勢識別器 - 地圖視圖委託協議已經有一個方法,告訴您何時標註附件配件calloutAccessoryControlTapped,並且此方法接收相關的annotationViewannotationView.annotation屬性讓你回到相關的註釋對象,然後你可以訪問它的coordinate屬性來獲取引腳的座標。

首先,在你的類一個新的屬性:

@property CLLocationCoordinate2D tappedCoord; 

然後實現委託方法

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    MKPointAnnotation *annotation=(MKPointAnnotation*)view.annotation; 
    self.tappedcoord=annotation.coordinate; 
    [self performSegueWithIdentifier:@"detailViewSegue"]; // Use your appropriate segue identifier 
} 

然後你就可以在prepareForSegue再次訪問屬性(,切換到適當的SEGUE名和目標視圖控制器類)

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"detailViewSegue" ]){ 
     DetailViewController *dvc=(DetailViewController *)segue.destinationViewController; 
     dvc.coord=self.tappedCoord; 
} 

另外,sin當你的MapView顯示用戶的位置時,會有一個註釋。你需要在你的viewForAnnotation方法中解決這個問題,如果註釋不是你的一個,則返回nil。您可以檢查註釋類以確定此 -

-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKAnnotationView* v = nil; 
    if ([annotation isMemberOfClass:[MKPointAnnotation class]]) { 
     static NSString* ident = @"Pin"; 
     v = [_map dequeueReusableAnnotationViewWithIdentifier:ident]; 
     if (v == nil) 
     { 
      v = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident]; 
      ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed; 
      UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      v.rightCalloutAccessoryView = infoButton; 
      v.centerOffset= CGPointMake(0,-20); 
      v.canShowCallout= YES; 
     } 
     v.annotation = annotation; 
    } 
    return v; 
} 
+0

謝謝你,這工作得很好:) –