将数据存储在MKAnnotation中?
所以我对Xcode和Objective-C很新。 我有几个存储在数组中的各种属性的ArtPiece对象。 然后我将它们作为MKAnnotations添加到mapview。 我需要能够做的是发送一个引用他们来自点击数组的位置。 我相信MKAnnotations只有数据成员的标题,图片和位置,所以当我从对象中创build一个MKAnnotation时,注解不会保留任何其他的属性。 所以,我的问题是,我如何能够保持对创build注释的对象的数组位置的引用,以便我可以将其发送给其他方法,以便可以从数组中检索有关该对象的附加信息以获取详细信息视图等有什么办法来存储一个单一的int值注释? 我不觉得还有其他的想法吗?
这是我的ArtPiece.h:
#import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface ArtPiece : NSObject <MKAnnotation>{ NSString *title; NSString *artist; NSString *series; NSString *description; NSString *location; NSString *area; NSNumber *latitude; NSNumber *longitude; UIImage *image; } @property (nonatomic, retain) NSString *title; @property (nonatomic, retain) NSString *artist; @property (nonatomic, retain) NSString *series; @property (nonatomic, retain) NSString *description; @property (nonatomic, retain) NSString *location; @property (nonatomic, retain) NSString *area; @property (nonatomic, retain) NSNumber *latitude; @property (nonatomic, retain) NSNumber *longitude; @property (nonatomic, retain) UIImage *image; @end
这里是.m:
#import "ArtPiece.h" #import "FindArtController.h" #import "ArtPiece.h" #import <MapKit/MapKit.h> @implementation ArtPiece - (NSString *)description{ return [NSString stringWithFormat:@"title: %@",title]; } @synthesize title, artist, series, description, latitude, longitude, location, area, image; - (CLLocationCoordinate2D)coordinate { CLLocationCoordinate2D theCoordinate; theCoordinate.latitude = [self.latitude doubleValue]; theCoordinate.longitude = [self.longitude doubleValue]; return theCoordinate; } @end
然后我继续创build该类的对象,设置它们的值,并将它们添加到AppDelegate中的数组中。 那么,在另一个class级,我使用:
[self.mapView addAnnotations:mainDelegate.mapAnnotations];
将注释添加到地图。 然而,当我尝试在viewforannotation方法中设置“艺术家”属性时,我得到了“请求会员艺术家不是结构或联合”。
显然,我一定是做这个分类的东西不对,但是我该怎么改?
这里是我现在使用的viewforannotation方法。 test.artist …行不起作用。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{ MKAnnotationView *test=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"reuse"]; test.image = [UIImage imageNamed:@"pao_pin.png"]; [test setCanShowCallout:YES]; [test setUserInteractionEnabled:YES]; test.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; test.artist = annotation.artist; return test; }
所以,我应该: annotation = (ArtPiece *)annotation
总之,我的目标是能够存储对象的数组位置的引用,以便我可以将这个引用发送给其他可以访问的方法该对象的详细视图等
在viewForAnnotation
方法中,您可以访问您的ArtPiece
属性,但为了避免编译器错误和警告,您需要首先将annotation
参数转换为您的自定义类。 该方法中的annotation
参数只是定义为一个id<MKAnnotation>
所以编译器不会知道ArtPiece特定的属性(直到你告诉它是ArtPiece
一个实例)。
你需要这样的东西:
ArtPiece *artPiece = (ArtPiece *)annotation; NSString *artist = artPiece.artist;
编辑:
当按下注解视图的标注button时,地图视图将调用calloutAccessoryControlTapped
委托方法。 该方法在view
参数中传递了MKAnnotationView
。 注释对象本身位于view
参数的annotation
属性中。 您可以将该对象转换为您的自定义类以访问您的ArtPiece
属性:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { ArtPiece *artPiece = (ArtPiece *)view.annotation; NSString *artist = artPiece.artist; }
换句话说,标注button处理程序不需要访问原始数组。 它获得了实际的ArtPiece
对象本身的参考。
创build一个MKAnnotation的子类,你可以添加任何你需要的额外的数据成员。
这里似乎有些混乱。
MKAnnotation
是一个协议,而不是一个类,所以你不要MKAnnotation
它,你实现它。 只要它实现了MKAnnotation
协议(坐标,标题,副标题),任何对象都可以是MKAnnotation
,如果创build它,那么该对象可以具有任何其他属性。 你已经完成了上面的正确。
通常情况下,您需要将<MKAnnotation>
投射到您的自定义类,如Anna Karenina所说,通知编译器它是什么types的对象。
MKAnnotationView
另一方面是一个类(和UIView
的子类),如果你想创build自己的,你可以inheritance它。 然后当它被地图创build和使用时,它保存对其相关MKAnnotation
的引用,所以在你的自定义MKAnnotationView
你可以:
self.artistLabel.text = [(ArtPiece *)self.annotation artist];
每个注释都有唯一的ID。 使用NSMutableDictionary
并使用您的注释唯一ID作为您想要的任何对象的关键。 以后你可以访问,当你打电话给这个:
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {