我首先要做的是创建一个也实现协议的Person
类(的子类)。如果您愿意,可以创建两个单独的类(“Person”和“PersonAnnotation”),但这不是必需的。NSObject
MKAnnotation
在Person
类中,您可以声明自己的个人相关属性,例如名字、姓氏、电子邮件地址等,或者您可以只拥有一个ABRecordRef
ivar 并让它为您存储各个字段。
ABPerson
我只会在我想实际展示ABPersonViewController
以保持 AB 特定代码隔离并ABPerson
更轻松地管理记录的创建和发布时才创建记录。无论如何,仅创建一个ABRecordRef
并不会将其添加到通讯簿中。正如ABPerson 参考文档所说:
人员记录不一定必须存储在通讯簿数据库中。您可以使用人员记录作为在内存中对联系人信息进行分组并通过例如人员视图控制器 (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
Web 服务类将创建一个实例Person
并设置属性。然后地图视图类会将该实例直接添加到地图中(因为 Person 已经实现了 MKAnnotation):
[mapView addAnnotation:person];
当点击 pin 时,地图视图将调用didSelectAnnotationView
委托方法。或者,您可以在注释的标注中添加一个披露按钮,并在委托方法viewForAnnotation
中对其进行响应。calloutAccessoryControlTapped
无论您决定使用哪种操作方法,您都可以在该方法中创建一个ABRecordRef
,从注释对象设置其值,然后显示ABPersonViewController
. 在这两种委托方法中,Person
可以使用以下方法检索注释对象:
Person *personTapped = (Person *)view.annotation;