Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将Parse PFobject objectID传递给映射注释视图按钮标题_Ios_Objective C_Parse Platform - Fatal编程技术网

Ios 将Parse PFobject objectID传递给映射注释视图按钮标题

Ios 将Parse PFobject objectID传递给映射注释视图按钮标题,ios,objective-c,parse-platform,Ios,Objective C,Parse Platform,我有一个注释视图设置,它向rightCalloutAccessoryView添加了一个UIButton。我试图做的是将按钮的标题设置为注释所表示的解析对象的objectID 我目前的结果是,每个注释都获取查询中第一个对象的objectID。我做错了什么 查看下面的代码,我发现restaurantID并不是每次一个大头针掉到地图上时都被设置的。在我看来,我把它放在了正确的位置,因为pins的标题和副标题更新正确 以下是我所做的: 1.)在my mainViewController.h中,我声明了一

我有一个注释视图设置,它向rightCalloutAccessoryView添加了一个UIButton。我试图做的是将按钮的标题设置为注释所表示的解析对象的objectID

我目前的结果是,每个注释都获取查询中第一个对象的objectID。我做错了什么

查看下面的代码,我发现restaurantID并不是每次一个大头针掉到地图上时都被设置的。在我看来,我把它放在了正确的位置,因为pins的标题和副标题更新正确

以下是我所做的:

1.)在my mainViewController.h中,我声明了一个字符串来保存PFobject的objectID:

@property (strong, nonatomic) NSString *restaurantID;
2.)在mainViewController.m中,我合成了变量

@synthesize restaurantID;
3.)在我的PFquery中,我将此restaurantID设置为PFobject的objectID(restaurantID=[object objectID];):

然后在注释视图中,我将按钮的标题设置为restaurantID:

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:restaurantID forState:UIControlStateNormal];
[rightButton addTarget:self
                action:@selector(buttonMethod:)
      forControlEvents:UIControlEventTouchUpInside];
在我的按钮方法中:我有一个NSLog来显示被按下按钮的标题。当我单击不同的管脚时,该值保持不变。它获取一个解析对象的objectID,但不为查询中的每个对象获取新的objectID


有什么想法吗?

在调用
addAnnotation
后,不一定会立即调用
viewForAnnotation
委托,也不一定每次只调用一次

当地图视图想要显示注释时,它将调用委托方法。如果用户平移或缩放地图,并且注释再次出现在屏幕上,则可能会在添加时稍晚发生此情况,或者对于同一注释,也可能再次发生此情况

因此,您不能像现在这样使用view controller level
restaurantID
变量(假设它只是相对于地图视图调用的注释设置的)。当地图视图调用注释的视图时,
restaurantID
被设置为与地图视图当前获取视图的注释无关的值


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

现在,由于您使用的是
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"];
还要确保正确处理注释视图重用。也就是说,如果
dequeue
返回一个视图,则将其
annotation
属性更新为当前属性(例如
annotationView.annotation=annotation;
)。如果未执行此操作,视图或详图索引也可以显示其他注释的数据


这将解决按钮显示错误标题的问题

然而,我假设您正在设置按钮的标题,这样您就可以知道用户点击了哪个注释。这将“起作用”,但有点麻烦,因为标题(restaurantID)将出现在披露图标的右侧(尽管它可能在标注中不可见)

我强烈建议使用地图视图的
calloutAccessoryControlTapped
delegate方法或地图视图的
selectedAnnotations
属性来代替这种方法。有关示例,请参见以下问题:


通过这种方式,您可以获得对注释对象本身的引用,并从中获得restaurantID(与
viewForAnnotation
中的方法相同)。

巨大的帮助。非常感谢。子类化MKPointAnnotation显然是一条可行之路。接下来我将介绍Callout AccessoryControlTapped delegate方法,使其成为更专业的实现。Anna-既然您对MapKit非常熟悉,您介意看一下这个问题吗?我的子类对于我正在传递的ID来说工作正常,但是我无法让我的UIImage从我的自定义子类传递:如何通过mapView的注释循环并再次检索该ID?从map.annotations://@ByroncetSee:使用isKindOfClass检查每个对象的注释类型时,它们似乎变成了MKUserLocation对象。找到类后,将其强制转换为类类型,然后检索自定义属性。如果不是您要查找的id,请转到下一个。
CustomAnnotationClass *foodPoint = [[CustomAnnotationClass alloc] init];
foodPoint.coordinate = (spot);
foodPoint.restaurantID = [object objectId]; //<--put objectId in foodPoint
foodPoint.title = [object objectForKey:@"restaurantName"];
//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];

    ...
}