Iphone 如何在mkmapview中添加注释

Iphone 如何在mkmapview中添加注释,iphone,annotations,mkmapview,abpersonviewcontroller,Iphone,Annotations,Mkmapview,Abpersonviewcontroller,我已经创建了一个person对象 ABRecordRef person = ABPersonCreate(); 我从web服务设置person的属性person设置了所有属性,如名字、姓氏、电子邮件id、电话号码、地址、url等 我想加载一个带有多个pin的地图视图,其中每个特定pin保存关于特定人的信息。单击每个pin,我需要加载每个人的ABPersonViewController类。我不确定如何使用我拥有的信息添加注释,以及特定pin如何保存特定人的信息。 在这种情况下,此人可能在我的通

我已经创建了一个person对象

ABRecordRef person = ABPersonCreate(); 
我从web服务设置person的属性
person
设置了所有属性,如名字、姓氏、电子邮件id、电话号码、地址、url等

我想加载一个带有多个pin的地图视图,其中每个特定pin保存关于特定人的信息。单击每个pin,我需要加载每个人的
ABPersonViewController
类。我不确定如何使用我拥有的信息添加注释,以及特定pin如何保存特定人的信息。 在这种情况下,此人可能在我的通讯簿中,也可能不在,我不需要将此人保存在我的通讯簿中。 我真的不知道该怎么做。我需要帮助

编辑:

我有三门课:

<代码>Web服务类:我有person对象的地方。 2. <代码>地图视图类:在其中加载地图视图。 3. <代码>注释类:其中包含有关我的注释的详细信息


如何使用个人记录并通过
ABPersonViewController
显示。我的
annotation
类应该是什么?

我首先要做的是创建一个
Person
类(NSObject的子类),该类还实现了
MKAnnotation
协议。如果愿意,可以创建两个单独的类(“Person”和“PersonAnnotation”),但这不是必需的

Person
类中,您可以声明自己与个人相关的属性,如名字、姓氏、电子邮件地址等,也可以只使用
ABRecordRef
ivar,让它为您存储各个字段

当我想实际显示
ABPersonViewController
时,我只会创建一个
ABPerson
记录,以隔离特定于AB的代码,并更轻松地管理
ABPerson
记录的创建和发布。无论如何,仅创建一个
ABRecordRef
不会将其添加到通讯簿中。正如政府所说:

个人记录不一定要存储在地址簿中 数据库您可以使用人员记录作为组联系人的一种方式 内存中的信息,并通过以下方式将其呈现给用户:, 个人视图控制器(ABPersonViewController)

因此,
Person
类可以如下所示:

@interface Person : NSObject<MKAnnotation>
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@property (nonatomic, copy) NSString *emailAddress;
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@end


@implementation Person

@synthesize firstName;
@synthesize lastName;
@synthesize emailAddress;
@synthesize coordinate;

-(NSString *)title
{
    return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
}

-(NSString *)subtitle
{
    return emailAddress;
}

@end
当触针时,地图视图将调用
didSelectAnnotationView
delegate方法。或者,您可以在注释的
viewForAnnotation
中向注释的标注添加一个披露按钮,并在
calloutAccessoryControlTapped
委托方法中响应该按钮

无论您决定使用哪种操作方法,都可以在该方法中创建一个
ABRecordRef
,从注释对象设置其值,然后显示
ABPersonViewController
。在这两种委托方法中,
Person
注释对象可以通过以下方式检索:

Person *personTapped = (Person *)view.annotation;

混乱具体在哪里?您必须将人员信息存储在ABPerson中吗?当您需要实际显示ABPersonViewController时,您可以创建ABPerson。虽然您应该能够使用ABPerson ivar创建注释类。将
person
存储在
ABPerson
中会自动将
person
保存在电话通讯簿中吗?在我的情况下,我不需要在通讯录中保存
person
,我只需要显示
person
的vCard,当我在web服务类的
mapview
中单击pin时,您是在创建ABPerson还是有自己的“person”类?我不认为仅仅在内存中创建一个ABPerson记录就可以将其添加到通讯簿中。我不是在创建
ABPerson
,我只是拥有
person
记录。我使用
ABRecordSetValue
将属性设置为
person
。在这种情况下,我是否应该子类化
ABPerson
。我的
注释类应该是什么样的。我还有一个问题。如何将
ABRecordref
作为方法的参数传递。在中,搜索
nameForSource
方法作为示例。我得到以下警告
将'ABRecordref'(又名'const void*)发送到'ABRecordref*'(又名'const void**')类型的参数将丢弃方法参数中的限定符,不要将其声明为
(ABRecordRef*)
。只需将其声明为
(ABRecordRef)
。注意示例应用程序中的方法声明:
-(NSString*)nameForSource:(ABRecordRef)source
OK。我的错。我试图将“ABRecordRef”作为对象传递。现在一切都好了。
Person *personTapped = (Person *)view.annotation;