我有一个注释视图设置,它将UIButton添加到rightCalloutAccessoryView。我想要做的是将按钮的标题设置为注释所代表的解析对象的objectID。
我当前的结果是每个注释都获取查询中第一个对象的objectID。我在这里做错了什么?
查看下面的代码我发现每次针脚在地图上掉落时都没有设置restaurantID。在我看来,我把它放在正确的位置,因为引脚的标题和副标题正确更新。
这就是我所做的:
1。)在我的mainViewController.h中,我声明了一个字符串来保存PFobject的objectID:
@property (strong, nonatomic) NSString *restaurantID;
2.。)在我的mainViewController.m中,我合成了变量
@synthesize restaurantID;
3.。)在我的PFquery中,我将此restaurantID设置为PFobject的objectID(restaurantID = [object objectId];):
for (PFObject *object in objects) {
PFGeoPoint *point = [[object objectForKey:@"geoLocation"] init];
CLLocationCoordinate2D spot;
spot.latitude = point.latitude;
spot.longitude = point.longitude;
MKPointAnnotation *foodPoint = [[MKPointAnnotation alloc] init];
foodPoint.coordinate = (spot);
restaurantID = [object objectId];
foodPoint.title = [object objectForKey:@"restaurantName"];
foodPoint.subtitle = [object objectForKey:@"cuisineType"];
leftIcon = [object objectForKey:@"restaurantImage"];
[leftIcon getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
if (!error) {
image = [UIImage imageWithData:data];
// image can now be set on a UIImageView
}
}];
[self.mainMap addAnnotation:foodPoint];
}
然后在我的注释视图中,我将按钮的标题设置为restaurantID:
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:restaurantID forState:UIControlStateNormal];
[rightButton addTarget:self
action:@selector(buttonMethod:)
forControlEvents:UIControlEventTouchUpInside];
在我的buttonMethod中:我有一个NSLog来显示按下的按钮的标题。该值与我点击不同的引脚时保持一致。它抓取一个Parse对象的objectID,但它没有抓取查询中每个对象的新objectID。
有什么想法吗?
答案 0 :(得分:1)
调用viewForAnnotation
后,addAnnotation
委托 p>
地图视图将在想要显示注释时调用委托方法。这可能比您添加它时稍晚发生,或者如果用户平移或缩放地图并且注释再次出现在屏幕上,则可能会再次发生相同的注释。
因此,您不能按照您的方式使用视图控制器级restaurantID
变量(假设它只是根据地图视图调用viewForAnnotation
的注释而设置)。当地图视图调用viewForAnnotation
时,restaurantID
被设置为某个值,该值与地图视图当前获取视图的注释无关。
相反,您应该将objectId
(甚至整个object
)分别放在每个注释 中。
目前,由于您使用的是MKPointAnnotation
类,因此您可以设置的唯一属性是coordinate
,title
和subtitle
。
您需要创建MKPointAnnotation
的子类或创建自己的实现MKAnnotation
协议的自定义类,并为其添加restaurantID
属性。
添加注释时设置此属性:
CustomAnnotationClass *foodPoint = [[CustomAnnotationClass alloc] init];
foodPoint.coordinate = (spot);
foodPoint.restaurantID = [object objectId]; //<--put objectId in foodPoint
foodPoint.title = [object objectForKey:@"restaurantName"];
然后在viewForAnnotation
中,使用annotation
参数获取与地图视图当前要求的注释相关的值:
//first make sure annotation is our custom type...
if ([annotation isKindOfClass:[CustomAnnotationClass class]])
{
UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
//cast annotation parameter to our class so compiler understands...
CustomAnnotationClass *fp = (CustomAnnotationClass *)annotation;
//get restaurantID from the annotation parameter ("fp")...
[rightButton setTitle:fp.restaurantID forState:UIControlStateNormal];
...
}
还要确保正确处理注释视图的重用。也就是说,如果dequeue
返回一个视图,请将其annotation
属性更新为当前属性(例如annotationView.annotation = annotation;
)。如果不这样做,视图或标注也可以显示不同注释的数据。
这应该可以通过显示错误标题的按钮来解决问题。
然而,我假设您正在设置按钮的标题,以便您可以找出用户点击的注释。这将“有效”,但它有点麻烦,因为标题(restaurantID)将出现在披露图标的右侧(尽管它可能在标注中不可见)。
我强烈建议您使用地图视图的calloutAccessoryControlTapped
委托方法或地图视图的selectedAnnotations
属性,而不是采用这种方法。请参阅以下问题以获取示例:
这样,您可以获得对注释对象本身的引用,并从中获取restaurantID(与viewForAnnotation
中的方式相同)。