オンラインで答えを見つけようとしましたが、答えがあるかもしれませんが、見つけるのに苦労しています。
コンセプト - SQL からデータをダウンロードしました。このデータを収集すると、配列によって地図上に注釈が表示されます。注釈をクリックすると、正しいタイトルとサブタイトルが表示されます。注釈のボタンをクリックすると、新しいビューがポップアップ表示され、その座標に関連するデータが表示されます。
問題 - SQL からダウンロードしたこのデータには、タイトル、座標などとは別に、画像、詳細、価格、Web サイトの詳細など、この別のビューに渡したい他のデータがあります。テーブル ビュー (index:row メソッド) を使用して問題を解決しますが、私の人生では、マップ ビューでは問題を解決できません。
私の質問は、注釈が取得した情報を収集して、これを他のデータとともに他のビューに渡すにはどうすればよいかということです。注釈を含む配列に余分なデータを追加して、ユーザーがボタンをクリックしたときにこれを生成しようとしましたが、最後のオブジェクトのみが配列に表示されます。
配列とデータの受け渡しについて頭を悩ませる必要がある深刻な学習があることは知っています。しかし、どんな助けでも大歓迎です。
私のホットスポットクラス:
@interface Hotspot : NSObject <MKAnnotation>
{
CLLocationCoordinate2D coordinate;
NSString *title;
NSString *subTitle;
NSString *detail;
float price;
NSString *contact;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subTitle;
@property (nonatomic, copy) NSString *detail;
@property (nonatomic) float price;
@property (nonatomic, copy) NSString *contact;
私のMapView(Companyクラスは、SQLファイルから取得したデータを保持します-「companys」を使用してViewDidLoadにすべてのデータをロードし、配列を使用します(これは問題なく動作します):-
- (void)loadAnnotations {
NSMutableArray *annotations = [[NSMutableArray alloc] init];
for (int i = 0; i < [companys count]; i++)
// storedNumber = i;
{
Company* company = [self.companys objectAtIndex:i];
CGFloat latitude = company.latitude;
CGFloat longitude = company.longitude;
Hotspot *myAnnotations = [[Hotspot alloc] init];
MKCoordinateRegion region = { { latitude , longitude } , { 12.0f , 12.0f } };
[myAnnotations setCoordinate: region.center];
[myAnnotations setSubTitle:company.type];
[myAnnotations setTitle:company.name];
[myAnnotations setDetail:company.details];
[myAnnotations setPrice:company.price];
[myAnnotations setContact:company.contact];
[annotations addObject: myAnnotations];
}
[promoView addAnnotations: annotations];
My Annotation View (あなたの提案を追加したら、これを変更する必要があります:
- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
NSLog(@"AnnotationView");
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// static NSString *AnnotationViewID = @"annotationViewID";
MKPinAnnotationView* pinView = (MKPinAnnotationView*)[promoView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if (!pinView) {
pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"CustomPinAnnotation"] autorelease];
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
NSLog(@"Map View Title, %@", annotation.title);
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"profile.png"]];
pinView.leftCalloutAccessoryView = profileIconView;
[profileIconView release];
if ([annotation isKindOfClass:[Hotspot class]]) {
pinView.pinColor = MKPinAnnotationColorRed;
pinView.draggable =YES;
}
else
pinView.pinColor = MKPinAnnotationColorGreen;
pinView.animatesDrop = YES;
pinView.canShowCallout = YES;
}
else
pinView.annotation = annotation;
return pinView;
}
あなたのコード -
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
PromoViewController *promoController = [[PromoViewController alloc] initWithNibName:@"DetailView" bundle:nil];
promoController.hotspot = (Hotspot*)view.annotation;
[self.navigationController pushViewController:promoController animated:YES];
[promoController release];
PromoViewController の場合、.h ファイルを次のように設定しました。
@interface PromoViewController : UIViewController
{
IBOutlet UILabel *nameLabel;
IBOutlet UILabel *detailLabel;
IBOutlet UILabel *typeLabel;
IBOutlet UILabel *contactLabel;
IBOutlet UILabel *priceLabel;
}
しかし、私はそれを実装する方法を100%確信していません。また、次の行でエラーが発生します:-
promoController.hotspot = (Hotspot*)view.annotation;
プロパティ hotspot がオブジェクト PromoViewController で見つからないと言っています。