1

オンラインで答えを見つけようとしましたが、答えがあるかもしれませんが、見つけるのに苦労しています。

コンセプト - 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 で見つからないと言っています。

4

1 に答える 1

1

渡すデータのタイプには、MKAnnotation プロトコル (つまり、タイトル、サブタイトル、座標) に準拠したコードが必要です。次に、その注釈をビューからビューに渡します。

たとえば (あなたのコードの方が良いでしょう)、Hotspot クラスを想像してみてください。

@interface Hotspot : NSObject <MKAnnotation> 

@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSString *subTitle;
@property (copy, nonatomic) NSString *moreInfo;
@property (copy, nonatomic) NSString *time;
@property (copy, nonatomic) NSNumber *altitude, *accuracy;

- (CLLocationCoordinate2D) coordinate;

mapView デリゲート クラスでは、次のようにします。

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{
    DetailViewController *detailController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
    detailController.hotspot = (Hotspot*)view.annotation;
    [self.navigationController pushViewController:detailController animated:YES];
    [detailController release];
}

次に、detailViewController で、表示したい情報 (説明、タイトル、画像など) を Hotspot クラスで利用できる限り表示します。


編集

コードを読んだら、次の 2 つの選択肢があります。PromoViewController にホットスポット プロパティを追加するか、mapView:annotationView:calloutAccessoryControlTapped からラベルを設定します。

カプセル化と設計の観点からは、はるかに優れている最初のものを使用します。

PromoViewController ヘッダーを次のように変更します

#import "Hotspot.h"

@interface PromoViewController : UIViewController
{
    IBOutlet UILabel *nameLabel;
    IBOutlet UILabel *detailLabel;
    IBOutlet UILabel *typeLabel;
    IBOutlet UILabel *contactLabel;
    IBOutlet UILabel *priceLabel;
}
@property (nonatomic, retain) Hotspot *hotspot;

PromoViewController.m で、viewWillAppear: メソッドを次のように変更します。

- (void)viewWillAppear:(BOOL)animated{
    nameLabel.text = hotspot.title;
    detailLabel.text = hotspot.detail;
    typeLabel.text = hotspot.subTitle;
    priceLabel.text = [NSString stringWithFormat:@"%0.2f", hotspot.price];
    //And so on...
}

もちろん、PromoViewController.m の上部に @synthesize ホットスポットを追加する必要があります。

于 2012-04-30T16:13:25.517 に答える