私のアプリには、ユーザーが画面を押すことで注釈を追加できる mapView があります。アノテーションが mapView にドロップされると、それらはシングルトンの可変配列に追加されます。注釈ビューには、押されたときに詳細ビュー (PinViewController と呼ばれます) をスタックにプッシュする吹き出しボタンがあります。私の問題は、吹き出しボタンが押されたときに、そのオブジェクトからアドレスと日付を取得できるように、その注釈オブジェクトのインデックスを詳細ビュー コントローラーに渡したいことです。しかし、吹き出しボタンを押すと、それがどのアノテーションであっても、常に配列内の最初のオブジェクトのインデックスが渡されます。何が間違っているのかわかりません。誰か助けてもらえますか? ここにいくつかのコードがあります:
- (void)mapView:(MKMapView *)mapView
annotationView:(MKAnnotationView *)view
calloutAccessoryControlTapped:(UIControl *)control {
PinViewController *pvc = [[PinViewController alloc]init];
[[self navigationController]pushViewController:pvc animated:YES];
NSUInteger pinIndex = [[Data singleton].annotations indexOfObject:view.annotation];
[pvc setIdentifier:pinIndex];
}
これは、詳細ビュー コントローラーからのものです。
- (void)viewDidLoad {
[super viewDidLoad];
[self.labelView setFrame:CGRectMake(10, 260, 300, 230)];
[PinViewController roundView:self.labelView onCorner:UIRectCornerAllCorners radius:15];
[[self view]addSubview:self.labelView];
self.annotation = [[Data singleton].annotations objectAtIndex:self.identifier];
self.addressLabel.text = self.annotation.address;
self.dateLabel.text = self.annotation.subtitle;
}
注釈が配列に追加される場所は次のとおりです。
- (void)press:(UILongPressGestureRecognizer *)recognizer {
CGPoint touchPoint = [recognizer locationInView:self.worldView];
CLLocationCoordinate2D touchMapCoordinate = [self.worldView convertPoint:touchPoint toCoordinateFromView:self.worldView];
self.geocoder = [[CLGeocoder alloc]init];
CLLocation *location = [[CLLocation alloc]initWithCoordinate:touchMapCoordinate
altitude:CLLocationDistanceMax
horizontalAccuracy:kCLLocationAccuracyBest
verticalAccuracy:kCLLocationAccuracyBest
timestamp:[NSDate date]];
[self.geocoder reverseGeocodeLocation:location
completionHandler:^(NSArray *placemarks, NSError *error) {
//NSLog(@"reverseGeocoder:completionHandler: called");
if (error) {
NSLog(@"Geocoder failed with error: %@", error);
} else {
CLPlacemark *place = [placemarks objectAtIndex:0];
self.geocodedAddress = [NSString stringWithFormat:@"%@ %@, %@ %@", [place subThoroughfare], [place thoroughfare], [place locality], [place administrativeArea]];
if (UIGestureRecognizerStateBegan == [recognizer state]) {
self.addressPin = [[MapPoint alloc]initWithAddress:self.geocodedAddress
coordinate:touchMapCoordinate
title:self.geocodedAddress];
[[Data singleton].annotations addObject:self.addressPin];
[self.worldView addAnnotation:self.addressPin];
NSLog(@"The number of pins in the annotation array is: %u",[Data singleton].annotations.count);
}
}
}];
}
したがって、基本的に、PinViewController に渡されるインデックスは、それがどのアノテーションであっても常に 0 です。このコードが機能しない理由がわかりません。