0

이 코드는 MapCallouts 데모의 코드입니다. 수백 가지의 다른 주석이 있다고 가정 해보십시오. 애플이 해냈 던 방식으로 많은 코드 중복을 초래할 것이다.여러 개의 MKAnnotation을 더 간단하게 코딩하는 방법은 무엇입니까?

어떤 클래스 인스턴스가 트리거했는지에 관계없이 위임을 트리거 한 클래스 인스턴스의 주석 속성에 액세스하려고합니다.

각 주석을 처리하고 하나의 보편적 인 방법이있는 if 문을 작성하는 것보다 간단한 방법이 있습니까?

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
    { 
     // if it's the user location, just return nil. 
     if ([annotation isKindOfClass:[MKUserLocation class]]) 
      return nil; 

     // handle our two custom annotations 
     // 
     if ([annotation isKindOfClass:[BridgeAnnotation class]]) // for Golden Gate Bridge 
     { 
      //do something 
     } 
     else if ([annotation isKindOfClass:[SFAnnotation class]]) // for City of San Francisco 
     { 
      //do something 
     } 

     return nil; 
    } 

답변

1

당신은 모든 주석 클래스 -annotationView과 같은 몇 가지 일반적인 방법을 제공있을 수 있습니다. 공통된 수퍼 클래스에서 모든 주석 클래스를 파생 시키거나 프로토콜을 만들 수 있습니다. 그런 다음, 주석 실제로 선택에 응답, 또는 일반적인 클래스의 하위 클래스임을 확인하고, 그것의보기를 위해 그것을 물어

if ([annotation respondsToSelector:@selector(annotationView)]) { 
    return [annotation annotationView]; 
} 

또는

if ([annotation isKindOfClass:[AbstractAnnotation class]]) { 
    return [annotation annotationView]; 
} 

이유 중 하나 하지 할 즉, 주석으로 사용하는 객체는 종종 데이터 모델의 일부이므로 주석 뷰에 대해 알지 못하는 비즈니스는 없을 수 있습니다. 제목, 부제 및 위치를 제공하는 것이 한 가지입니다. 뷰의 실제 인스턴스를 제공하는 것은 모델 객체가 수행해야하는 범위를 벗어나는 경우가 많습니다.

주석보기는 일반적으로 그림을 표시하고 설명보기에 왼쪽 및 오른쪽 액세서리를 제공하는 것 외에 너무 많은 것을하지 않습니다. 수백 개의 다른 주석 뷰 하위 클래스가 필요할 가능성이 큽니까? 또는 모든 주석에 대해 공통된 주석보기를 사용할 수 있으며 주석보기의 이미지를 변경하는 것과 같이 다르게 구성 할 수 있습니까?

관련 문제