gpt4 book ai didi

ios - 将 SQL 数据从 Annotation click 传递到新 View

转载 作者:行者123 更新时间:2023-11-29 13:36:49 25 4
gpt4 key购买 nike

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

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

问题 - 在我从 SQL 下载的数据中,除了标题、坐标等我想传递给其他 View 的数据外,还有其他数据,例如图像、详细信息、价格、网站详细信息等。我可以通过 TableView (index:row 方法)可以毫无问题地执行此操作,但对于我来说,不是在 map View 中。

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

我知道我需要认真学习一些关于数组和传递数据的知识;但我们将不胜感激。

我的热点类:

 @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 文件中获得的数据 - 我使用“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];

我的注释 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;

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

最佳答案

您传递的数据类型应该有它们的代码,遵守 MKAnnotation 协议(protocol)(即标题、副标题和坐标)。然后将该注释从一个 View 传递到另一个 View 。

例如(您的代码会更好),想象一个 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 委托(delegate)类中,您将执行如下操作:

- (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 header 更改为

#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 热点

关于ios - 将 SQL 数据从 Annotation click 传递到新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com