gpt4 book ai didi

objective-c - 自定义 MKAnnotation 总是说它是一个 MKUserLocation 类

转载 作者:行者123 更新时间:2023-11-28 17:47:19 25 4
gpt4 key购买 nike

我有一个名为 Device 的自定义类,它实现了 MKAnnotation 协议(protocol)。在我关注的示例中(来自 O'Reilly Media 的 iPad 上的 MapKit 和核心位置),他们说要检查我要添加的注释是否是 MKUserLocation 类,如果是则返回 nil .我完全理解它的作用,但问题是我的 Device 类始终被标识为 MKUserLocation 所以它总是返回 nil 所以我永远不会在 map 上添加任何注释。我一遍又一遍地检查代码。我也有 O'Reilly 代码示例,但我看不出我要去哪里。真是令人沮丧。

这是我的 Device.m:

@implementation Device

@synthesize udId, user, latitude, longitude;

- (CLLocationCoordinate2D)coordinate {
CLLocationCoordinate2D internalCoordinate;

internalCoordinate.latitude = [self.latitude doubleValue];
internalCoordinate.longitude = [self.longitude doubleValue];

return internalCoordinate;
}

- (NSString *)title {
return self.user;
}

- (NSString *)subtitle {
return nil;
}

- (id)initWithUDId:(NSString *)_udId User:(NSString *)_user Latitude:(NSNumber *)_latitude Longitude:(NSNumber *)_longitude {
if (self == [super init]) {
self.udId = _udId;
self.user = _user;
self.latitude = _latitude;
self.longitude = _longitude;
}

return self;
}

- (void)dealloc {
[udId release];
self.udId = nil;

[user release];
self.user = nil;

[latitude release];
self.latitude = nil;

[longitude release];
self.longitude = nil;

[super dealloc];
}

@end

这是我的 DeviceMapAnnotator.m:

@implementation DeviceMapAnnotator

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
if ([annotation isKindOfClass:[MKUserLocation class]]) {
NSLog(@"annotation is an MKUserLocation class");

return nil;
}

MKPinAnnotationView *deviceAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"DeviceAnnotation"];

if (deviceAnnotationView == nil) {
deviceAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"DeviceAnnotation"] autorelease];
deviceAnnotationView.animatesDrop = NO;
deviceAnnotationView.pinColor = MKPinAnnotationColorRed;
}

return deviceAnnotationView;
}

- (void)dealloc {
[super dealloc];
}

@end

下面是从我的 DashboardViewController.m 调用它的代码:

- (void)updateMapAnnotations:(NSArray *)devices {
for (Device *device in devices) {
[map addAnnotation:device];
}
}

下面是从我的应用委托(delegate)调用 updateMapAnnotations 的代码:

- (void)requestFinished:(ASIHTTPRequest *)request {
if (![request error]) {
NSError *jsonError = nil;
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithJSONString:[request responseString] error:&jsonError];

if (!jsonError || ([[jsonDictionary objectForKey:@"Success"] intValue] == 1)) {
NSArray *jsonDevicesArray = [jsonDictionary objectForKey:@"Devices"];
NSMutableArray *devicesArray = [[NSMutableArray alloc] initWithCapacity:[jsonDevicesArray count]];

for (NSDictionary *deviceDictionary in jsonDevicesArray) {
[devicesArray addObject:[[[Device alloc] initWithUDId:[deviceDictionary objectForKey:@"UDId"] User:[deviceDictionary objectForKey:@"User"] Latitude:[NSNumber numberWithDouble:[[deviceDictionary objectForKey:@"Latitude"] doubleValue]] Longitude:[NSNumber numberWithDouble:[[deviceDictionary objectForKey:@"Longitude"] doubleValue]]] autorelease]];
}

[dashboardViewController updateMapAnnotations:devicesArray];
} else {
// AUTHORIZATION FAILED
}
}
}

我基本上每 45 秒调用一次服务器,获取设备列表及其位置作为 JSON 字符串,然后将其反序列化为包含 DeviceNSArray对象。然后,我将该数组传递给 updateMapAnnotations,然后循环它并调用 addAnnotation。整个过程有效,我保证发送到 DeviceMapAnnotator 的对象属于 Device 类型,但是 MKUserLocation 检查总是过早返回,并且整个过程完全停在水中。

如果知道他们正在使用 iOS/Objective-C 等做什么的人可以帮助我(这几乎是每个人,因为我显然是个白痴),我将非常感激。

为了发泄,我必须说 Objective-C 很快就进入了我的 $hit 列表。

最佳答案

我也没有立即发现您的代码有任何问题。但是,不是最初测试注解是否是 MKUserLocation,而是可以不直接测试它并测试注解是否是 Device,如下所示:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
if ([annotation isKindOfClass:[Device class]]) {
MKPinAnnotationView *deviceAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"DeviceAnnotation"];

if (deviceAnnotationView == nil) {
deviceAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"DeviceAnnotation"] autorelease];
deviceAnnotationView.animatesDrop = NO;
deviceAnnotationView.pinColor = MKPinAnnotationColorRed;
}

return deviceAnnotationView;
} else {
NSLog(@"annotation is not a Device");

return nil;
}
}

这可能不是一个非常有用的建议,因为它基本上做同样的事情,但也许以稍微不同的方式进行调试会在调试时产生不同的结果并导致真正的问题。

关于objective-c - 自定义 MKAnnotation 总是说它是一个 MKUserLocation 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4940576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com