如何在mkmapview中添加注释

时间:2012-03-22 12:27:04

标签: iphone annotations mkmapview abpersonviewcontroller

我创建了一个人物对象

ABRecordRef person = ABPersonCreate(); 

我从我的网络服务中设置了人物的属性。 person已设置所有属性,例如姓名,姓氏,电子邮件ID,电话号码,地址,网址等。

我想加载一个带有多个引脚的地图视图,其中每个特定引脚都包含有关特定人员的信息。单击每个引脚,我需要加载每个人的ABPersonViewController类。我不确定如何使用我拥有的信息添加注释以及特定引脚如何保存有关特定人员的信息。 在这种情况下,此人可能会或可能不会在我的地址簿中,我不需要将此人保存在我的地址簿中。 我真的很困惑如何做到这一点。需要帮助。

编辑:

我有3个班级:

Web service class:我有person对象的地方。 2. MapView class:我加载地图视图的地方。 3. Annotation class:其中包含我的注释的详细信息。

我如何使用人员记录并通过ABPersonViewController呈现。我的annotation课应该如何?

1 个答案:

答案 0 :(得分:1)

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

Person课程中,您可以声明自己与人相关的属性,例如名字,姓氏,电子邮件地址等,或者您可以拥有ABRecordRef ivar并让它为您存储各个字段。

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

  

人员记录不一定必须存储在地址簿中   数据库。您可以使用人员记录作为分组联系的方式   例如,存储器中的信息并通过它呈现给用户   人视图控制器(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];

点击图钉时,地图视图将调用didSelectAnnotationView委托方法。或者,您可以在viewForAnnotation中向注释的标注添加公开按钮,并在calloutAccessoryControlTapped委托方法中对其进行回复。

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

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