我遇到了MKPolygon
子类的问题。
我想添加一个简单的int tag
属性,但我不断获取MKPolygon的实例而不是我的自定义类,因此调用setTag:
会导致异常。
问题是MKPolygons是使用类方法创建的:polygonWithCoordinates: count:
我不知道如何将其转换为我的类的实例(包括标记属性)。
您如何向MKPolygon添加标签属性?
谢谢!
答案 0 :(得分:20)
你们都应该使用一个类别(如@Seva建议)和objc_setAssociatedObject(如@hoha建议的那样)。
@interface MKPolygon (TagExtensions)
@property (nonatomic) int tag;
@end
@implementation MKPolygon (TagExtensions)
static char tagKey;
- (void) setTag:(int)tag {
objc_setAssociatedObject( self, &tagKey, [NSNumber numberWithInt:tag], OBJC_ASSOCIATION_RETAIN );
}
- (int) tag {
return [objc_getAssociatedObject( self, &tagKey ) intValue];
}
@end
除了@hoha链接到的API之外,您可能还需要查看Associative References section of the ObjC Guide。
答案 1 :(得分:5)
看起来MKPolygon
的开发人员没有使其继承友好。如果你想要的只是为这个实例添加一些标签,你可以
1)保留从MKPolygon
实例地址到标签的地图(NSDictionary或CFDictionary)。如果在设置的同一类中需要所有标记,则此解决方案很有效。
2)使用运行时直接将标签附加到多边形 - objc_setAssociatedObject
(Objective-C Runtime Reference)
答案 2 :(得分:2)
我面临同样的问题。一个简单的解决方案是只使用MKPolygon的Title属性来保存您在Tag中保存的内容。至少在我不需要对象引用但只需要简单数字的情况下,它可以正常工作
答案 3 :(得分:1)
SpecialPolygon *polygon = [SpecialPolygon polygonWithCoordinates:count:];
[polygon setInt: 3];
关键是,使用SpecialPolygon
工厂方法而不是MKPolygon
方法,您将获得所需的SpecialPolygon
子类。
答案 4 :(得分:0)
您是在谈论代码或其他地方创建的MKPolygons吗?如果是前者,只需覆盖polygonWithStuff方法即可。如果是后者,请考虑超过MKPolygon的类别。然后项目中的所有MKPolygons都会有一个标记。
答案 5 :(得分:0)
因为看起来作者不愿意阻止你进行子类化(至少,这是公共接口的一个可能动机),考虑使用一种组合形式: