2013-07-01 2 views
1

이 질문은 이전에 다른 사람들이 물어 보았지만 이전에이 포럼에서 읽었지만 지금까지 행운을 빌지 않고 제안한 방법을 시도해 보았습니다. 이 질문.viewForAnnotation이 호출되지 않았습니다. (iOS noob)

아래 코드는 MKMapView의 핀 아이콘을 변경하기위한 것입니다. 그러나 viewForAnnotation 함수는 MKMapView에 의해 호출되는 것조차 보이지 않습니다. 사람들은 .xib 파일의 맵보기를 파일 소유자로 드래그하거나 myMap.delegate = self를 정의하여 파일의 소유자에게 기능을 위임 할 때 몇 가지 문제가 있다고 말했다. 나는 두 가지 방법을 모두 마쳤지 만 여전히 아무것도 얻지 못합니다.

정말 내 문제에 대한 도움을 주셔서 감사합니다, 감사합니다.

CODE :

- (MKPinAnnotationView*)myMap:(MKMapView*)myMap viewForAnnotation:(id<MKAnnotation>)annotation{ 

    MKPinAnnotationView *pin = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomPin"]; 

    UIImage *icon = [UIImage imageNamed:@"bustour.png"]; 
    UIImageView *iconView = [[UIImageView alloc] initWithFrame:CGRectMake(8,0,32,37)]; 

    if(icon == nil) 
     NSLog(@"image: "); 
    else 
     NSLog(@"image: %@", (NSString*)icon.description); 

    [iconView setImage:icon]; 
    [pin addSubview:iconView]; 
    pin.canShowCallout = YES; 
    pin.pinColor = MKPinAnnotationColorPurple; 

    return pin; 
} 

위임하여 .h 클래스 enter image description here

답변

4

대리자 메서드의 이름이 myMap:viewForAnnotation:으로 잘못 지정되었습니다.

이 같은 mapView:viewForAnnotation:를 지정해야합니다 viewForAnnotation 위임 방법 :

- (MKAnnotationView *)mapView:(MKMapView *)mapView 
      viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    //code goes here... 
} 

지도보기가 정확히 일치하는 메소드 이름을 찾습니다.
찾을 수없는 경우, 전화를 걸지 않고 기본 빨간색 핀을 만듭니다.


매개 변수의 이름은 변경할 수 있지만 메서드 이름은 변경할 수 없습니다.

예를 들어,이 또한 확인 될 것이다 :

내가 모든 헤더 파일에 포함 할 필요가 없도록 내가 .PCH (게으른 방법)에 mapkit 헤더를 가져온
- (MKAnnotationView *)mapView:(MKMapView *)myMap 
      viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    //code goes here... 
} 
+0

바로 그 자리에서 @Anna에게 감사한다! 여기에 여전히 질문이 있습니다. 괜찮 으면 내 코드에서 기본적으로 mapView를 myMap이라는 이름으로 코드에 표시했습니다. 위임 메소드가 왜 정의하지 않았거나 생성하지 않은 mapView에서 왔습니까? 어디에서 왔습니까? –

+1

대리자 메서드 이름은 MKMapViewDelegate 프로토콜에 필요합니다. Objective-C 규칙에 따라 해당 프로토콜을 준수하기 때문에 그에 따라 메서드의 이름을 지정해야합니다. 모든지도보기 개체는 이름에 관계없이 대리인 메서드 이름 (위임/프로토콜 계약 - 작동 방식 또는 언어 디자인 방식)을 찾습니다. 앞에서 말했듯이 내부 매개 변수의 이름은 원하는대로 변경할 수 있습니다. 메소드 외부에있는 오브젝트의 이름을 일치시킬 필요조차 없습니다. – Anna

+1

지도보기 개체가 해당 대리자 메서드를 호출하면 첫 번째 매개 변수로 자신에 대한 참조를 전달합니다. 이 메소드에서 매개 변수 이름은 아무 것도 될 수 있지만 호출 한 맵보기 오브젝트를 여전히 참조합니다. 여전히 명확하지 않은 경우 Objective-C 또는 프로토콜 소개 (developer.apple.com에는 좋은 설명서가 있음)를 읽을 수 있습니다. – Anna

0

수입 우는 클래스 .. 또한

#import <MapKit/MapKit.h> 

하고 당신이 클래스에서 MKMapViewDelegate 추가 등이 될 ...

@interface PTAViewController : UIViewController<MKMapViewDelegate>{ 

    ///...... your code.. 

} 

@end 
+0

. 그들은 다른 영향을 미칩니 까? –

+0

아니요, 위 코드처럼 위임을 정의합니다. 'UIViewController '?? 그것을 밖으로 시도하고 또한'viewDidLoad :'메서드에서 MapView에 SELF에 대리자를 제공하십시오 ... –

+0

안녕하세요, 그것을 시도 하고이 오류가 : [UIViewController _loadViewFromNibNamed : 번들 :] "PTAViewController"펜촉을로드했지만 볼 콘센트 있었 설정되지 않았습니다. ' –

0

아시다시피, 아울렛을 설정하고 대리인이 아닙니다. 대리자를 설정하려면 다음과 같이하십시오. enter image description here

+0

안녕하세요,하지만 그것을 시도했지만 오류가 : [UIViewController _loadViewFromNibNamed : 번들 :]로드 된 "PTAViewController"펜촉 있지만 뷰 콘센트가 설정되지 않았습니다. 나는 지금 내가 길을 잃었다. –

관련 문제