Пользовательский MKAnnotation всегда говорит, что это класс MKUserLocation - PullRequest
1 голос
/ 09 февраля 2011

У меня есть собственный класс с именем 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 очень быстро попал в мой список попаданий.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2011

Хорошо, я заставил это работать, хотя я не знаю точно, какое было решение.В конце концов я все записал и переписал с нуля в новый файл, и в тот момент это сработало.Я также понял, что не отправляю обратно широту и логитизацию в JSON, однако это все еще не является проблемой, поскольку они все равно будут инициализированы как 0.0.В конце концов, я понятия не имею, что действительно исправило это, но это работает, поэтому я возьму это.

Извините, что потратил время ваших парней.(

0 голосов
/ 17 февраля 2011

У меня была похожая проблема. Очевидно, что удаление аннотаций из mapView вызывает некоторые проблемы с их выпуском. Закомментирование кода исправило его.

- (void)dealloc {

//[mapView removeAnnotations:mapView.annotations];  

[super dealloc];

}

0 голосов
/ 09 февраля 2011

Я не сразу вижу никаких проблем с вашим кодом.Однако вместо первоначального тестирования, чтобы увидеть, является ли аннотация 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;
    }
}

Это можетне будет очень полезным предложением, так как оно делает в основном то же самое, но, возможно, выполнение его немного другим способом приведет к другому результату при отладке и приведет к реальной проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...