objective c - Custom MKAnnotation always says it's an MKUserLocation class -
i have custom class called device implements mkannotation protocol. in examples i'm following (mapkit , core location on ipad o'reilly media), check if annotation want add mkuserlocation class , return nil if is. understand does, problem device class identified mkuserlocation returns nil never annotations added map. i've gone on code again , again , again. i've o'reilly code samples , can't see i'm going off. it's frustrating.
here's 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 and here's devicemapannotator.m:
@implementation devicemapannotator - (mkannotationview *)mapview:(mkmapview *)mapview viewforannotation:(id <mkannotation>)annotation { if ([annotation iskindofclass:[mkuserlocation class]]) { nslog(@"annotation 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 and here's code calling dashboardviewcontroller.m:
- (void)updatemapannotations:(nsarray *)devices { (device *device in devices) { [map addannotation:device]; } } and here's code calling updatemapannotations app delegate:
- (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]]; (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 } } } i make call server every 45 seconds, list of devices , locations json string deserialized nsarray containing device objects. pass array updatemapannotations loops , calls addannotation. whole process works, , guarantee objects being sent devicemapannotator of type device, mkuserlocation check returns prematurely , whole process stopped dead in water.
i appreciate if knows they're doing ios/objective-c, etc, can me out (that's pretty because apparently idiot).
just vent, must objective-c getting on $hit list fast.
i not seeing problem code either. however, instead of testing see if annotation mkuserlocation, instead not test directly , test whether annotation device, so:
- (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 not device"); return nil; } } this might not helpful suggestion since same thing, maybe doing different way yield different result when debugging , lead real problem.
Comments
Post a Comment