将Parse PFobject objectID传递给地图注释视图按钮标题

时间:2013-12-31 21:48:38

标签: ios objective-c parse-platform

我有一个注释视图设置,它将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。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

调用viewForAnnotation 后,addAnnotation委托 p>

地图视图将在想要显示注释时调用委托方法。这可能比您添加它时稍晚发生,或者如果用户平移或缩放地图并且注释再次出现在屏幕上,则可能会再次发生相同的注释。

因此,您不能按照您的方式使用视图控制器级restaurantID变量(假设它只是根据地图视图调用viewForAnnotation的注释而设置)。当地图视图调用viewForAnnotation时,restaurantID被设置为某个值,该值与地图视图当前获取视图的注释无关。


相反,您应该将objectId(甚至整个object)分别放在每个注释 中。

目前,由于您使用的是MKPointAnnotation类,因此您可以设置的唯一属性是coordinatetitlesubtitle

您需要创建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中的方式相同)。