2012-07-27 2 views
0

사용자가 핀을 선택할 때 해당 핀에 대한 세부 화면으로 이동하는 핀이있는 맵보기가 있습니다. 또한 사용자가 항목을 선택하면 동일한 유형의 상세보기로 이동하는 테이블보기가 있습니다.MKMapView MKAnnotationView 문제?

배열을 통해 mapview에 다중 핀을 추가합니다. 나는

여기

I 버튼 핀 선택을 누릅니다

다른 핀에 대한 상세 뷰에 그를 걸립니다 ... 문제 야, 액세서리보기 버튼을 추가했습니다. 하지만 테이블보기에서 여전히 잘 작동합니다. ..one pls 이걸로 나를 도울 ...?

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *newAnnotation = nil; 
    if([annotation.title isEqualToString:@"You are here."]) 
    { 
     newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"greenpin"]; 
     newAnnotation.pinColor = MKPinAnnotationColorGreen; 
    } 
    else 
    {  
     newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"redpin"]; 
     newAnnotation.pinColor = MKPinAnnotationColorRed; 
     UIButton *pinButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     pinButton.tag = indexvar; 
     [newAnnotation addSubview:pinButton]; 
     newAnnotation.canShowCallout = YES;  
     newAnnotation.rightCalloutAccessoryView = pinButton; 
     newAnnotation.calloutOffset = CGPointMake(-5, 5); 
     indexvar++; 
     return newAnnotation; 
     [pinButton release]; 
    } 
    newAnnotation.animatesDrop = YES; 
    newAnnotation.canShowCallout = YES; 
    return newAnnotation; 
} 

- (void)mapView:(MKMapView *)wikiMapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    NSInteger selectedIndex = ((UIButton *)control).tag; 
    NSLog(@"Property Index : %d ",selectedIndex); 
    DetailView = [[PropertyDetails alloc] initWithNibName:@"PropertyDetails" bundle:nil]; 
    DetailView.propertyReference = [PropertyReferenceArr objectAtIndex:selectedIndex]; 
    DetailView.propertyTitle = [propertyTitlesArr objectAtIndex:selectedIndex]; 
    DetailView.propertyPrice = [propertyPriceArr objectAtIndex:selectedIndex]; 
    DetailView.propertyBedrooms = [propertyBedroomsArr objectAtIndex:selectedIndex]; 
    DetailView.propertyLatitude = [propertyLatitudesArr objectAtIndex:selectedIndex]; 
    DetailView.propertyLongitude = [propertyLongitudesArr objectAtIndex:selectedIndex]; 
    DetailView.propertyDefaultImage = [PropertyImageArr objectAtIndex:selectedIndex]; 
    DetailView.propertyStatusId = [PropertyStatusArr objectAtIndex:selectedIndex]; 
    [self.navigationController pushViewController:DetailView animated:YES];   
    [DetailView release]; 
} 

답변

0
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{  
    myAnnotation *annView = view.annotation; // myAnnotation is my custom class for annotations 
    // now in annView you have the exact annotation whose accessorybutton is clicked now you can do whatever you want with it. 
    NSLog(@"title = %@",annView.title); 
} 

다음은

[newAnnotation addSubview:pinButton]; // i think this is wrong you should only add it to accessory view 
+0

액세서리보기 제안에 감사하지만 세부적인보기 문제는 아직 해결되지 않았습니다 ...! – roamingsoul

1

을 사용하는 당신은 당신의 코드에서

을 원하는대로 학습과을 비교 한 나에 대한 주석의 제목이나 자막을 사용할 수있는 버튼 태그를 설정하는 대신 viewForAnnotation에서 ivar 카운터 (indexvar) 을 사용하여 단추 태그를 설정하는 방법은 대리자 메서드가 onl y를 한 번 클릭하고 주석이 추가되는 순서대로 (일부 루프에서는 색인 순서대로 수행 할 것입니다).

위의 가정은 안전하지 않으며 권장되지 않습니다. 예를 들어,지도보기에서 주석을 다시 표시해야하는 경우 동일한 주석에 대해 대리자 메서드를 여러 번 호출 할 수 있습니다.

버튼 태그를 사용하는 대신 필요한 정보를 주석 클래스 자체에 포함하고 주석을 추가 할 때 해당 정보를 설정하십시오.

최소한 (권장하지는 않지만) 특수 효과 클래스에 propertyIndex 속성을 추가하고 주석을 생성하는 배열 색인 (예 : PropertyReferenceArr 배열)과 동일하게 설정하면됩니다.

calloutAccessoryControlTapped에서 사용하는 수많은 배열을 기반으로하는 더 나은 해결책은 적절한 클래스 개체를 만들어 ("속성"개체의) 모든 속성을 보유한 다음 보유 할 하나의 배열로 만드는 것입니다 (각 속성에 대한 별도의 배열 대신).

이 클래스는 자체적으로 MKAnnotation을 준수 할 수 있으므로 별개의 명시 적 주석 객체를 만들 필요가 없습니다 (속성 객체 자체를지도에 추가 할 수 있음).

그런 다음 calloutAccessoryControlTapped에, 당신은 사용자 정의 클래스에 view.annotation을 캐스팅하고 당신은 즉시 태그 또는 배열 인덱스에 대한 필요없이 모든 주석/속성 데이터에 액세스 할 수 있습니다.

@naveen이 귀하의 addSubview 행에 대한 주석도 유효합니다 (문제와 관련 없음). 확실히 제거해야합니다.

또한 viewForAnnotation에서 return 다음에 [pinButton release];을 부르는 것은 무의미합니다. 이 코드는 절대 실행되지 않습니다 (이는 return 앞에 넣으면 pinButton이 자동으로 리사용되기 때문에 앱이 다운되기 때문에 좋습니다).

+0

그것은 당신의 시간 동안 매력 ... 고맙다처럼 일했다. ..! – roamingsoul