У меня есть собственный класс с именем Device
, который реализует протокол MKAnnotation
.В примерах, которым я следую (MapKit и Core Location на iPad от O'Reilly Media), они говорят, чтобы проверить, является ли аннотация, которую я хочу добавить, классом MKUserLocation
и вернуть nil, если это так.Я полностью понимаю, что это делает, но проблема в том, что мой класс Device
всегда идентифицируется как MKUserLocation
, поэтому он всегда возвращает ноль, поэтому я никогда не добавляю аннотации на карту.Я перебрал код снова и снова и снова.У меня также есть примеры кода 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];
}
}
А вот код, вызывающий 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, которая затем десериализуется в NSArray
, содержащий Device
объекты.Затем я передаю массив в updateMapAnnotations
, который затем зацикливает его и вызывает addAnnotation
.Весь процесс работает, и я гарантирую, что объекты, отправляемые на DeviceMapAnnotator
, имеют тип Device
, однако проверка MKUserLocation
всегда возвращается преждевременно, и весь процесс просто останавливается в воде.
Я был бы очень признателен, если бы кто-то, кто знает, что они делают с iOS / Objective-C и т. Д., Может мне помочь (это почти все, потому что я, очевидно, идиот).
Просто чтобы высказатьсяЯ должен сказать, что Objective-C очень быстро попал в мой список попаданий.