从Annotation中传递SQL数据单击到新视图

时间:2012-04-30 12:37:11

标签: ios objective-c arrays annotations mapkit

我试图在网上找到答案,也许有答案,但我很难找到答案。

概念 - 我从SQL下载数据。我收集这些数据,数组显示地图上的注释。单击注释时,将显示正确的标题和副标题。单击注释上的按钮时,新视图会弹出与该坐标相关的显示数据。

问题 - 在我从SQL下载的这些数据中,除了标题,坐标等我还想传递给其他视图的其他数据,例如图像,详细信息,价格,网站详细信息等。我可以通过表视图(索引:行方法)可以毫无问题地执行此操作,但对于我的生活,而不是在地图视图中。

所以我的问题是 - 我如何收集注释所获取的信息,并将其与其他数据一起传递到另一个视图。我尝试在带有注释的数组中添加额外数据,并在用户单击按钮时生成此数据,但只有最后一个对象显示在数组中。

我知道有一些认真的学习我需要了解数组并传递数据;但是我们将非常感谢任何帮助。

我的热点课程:

 @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(公司类保存我从SQL文件中获取的数据 - 我使用'公司'在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];

我的注释视图(一旦我添加了您的建议,就需要更改:

- (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;
}

但我不是百分百确定如何实现它,而且我在这一行上也遇到错误: -

promoController.hotspot = (Hotspot*)view.annotation;

说在对象PromoViewController上找不到属性热点。

1 个答案:

答案 0 :(得分: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类中可用。


修改

阅读完代码后,您有两种选择:在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热点