проблема с аннотацией

когда я нажимаю на аннотацию, она должна показать мне это маленькое окно, которое не в моем случае, аннотации здесь, но когда я нажимаю на одну из них, приложение выдает исключение, и я подумал, что этот код создает проблемы:

  for (int i=0; i<[array count]; i++) {

           NSDictionary *stationEnCours=[array objectAtIndex:i];


           NSString *distance=[stationEnCours objectForKey:@"distance"];
           float lng = [[stationEnCours objectForKey:@"ssiphone_longitude"]   floatValue];
           float lat = [[stationEnCours objectForKey:@"ssiphone_latitude"] floatValue];
           NSString *ensStation=[stationEnCours objectForKey:@"ssiphone_enseigne"];

           location2D = (CLLocationCoordinate2D){ .latitude = lat, .longitude = lng };
           MyLocation *annotation=[[[MyLocation alloc]initWithName:ensStation distanceVersLaStation:distance coordinate:location2D]autorelease];
           [mapView addAnnotation:annotation];
           MKCoordinateSpan span={latitudeDelta:0.2,longitudeDelta:0.2};
           MKCoordinateRegion region={location2D,span};
           [mapView setRegion:region];
           [self.view addSubview:mapView];
           }

и для класса MyLocation, который реализует протокол MKAnnotation, у меня есть это:

@implementation MyLocation
@synthesize enseigneDeLaStation=_enseigneDeLaStation;
@synthesize distanceVersLaStation=_distanceVersLaStation;
@synthesize coordinate=_coordinate;



-(id)initWithName:(NSString *)enseigneDeLaStation distanceVersLaStation:(NSString *) distanceVersLaStation coordinate:(CLLocationCoordinate2D)coordinate
{
    if ((self = [super init])) {
        _enseigneDeLaStation = [enseigneDeLaStation copy];
        _distanceVersLaStation = [distanceVersLaStation copy];
        _coordinate = coordinate;
    }
    return self;
}

- (NSString *)title {
    return _enseigneDeLaStation;
}

- (NSString *)subtitle {
    return _distanceVersLaStation;
}

- (void)dealloc
{
    [_enseigneDeLaStation release];
    _enseigneDeLaStation = nil;
    [_distanceVersLaStation release];
    _distanceVersLaStation = nil;    
    [super dealloc];
}       


@end

помогите, заранее спс))

EDIT @Anna: я исправил те моменты, которые вы упомянули, но у меня все еще та же проблема:

for (int i=0; i<[array count]; i++) {
           //afficher sur la carte (map)
           NSDictionary *stationEnCours=[array objectAtIndex:i];
           //NSString *adresseStation=[stationEnCours objectForKey:@"ssiphone_adresse"];

           //float distance = [[stationEnCours objectForKey:@"distance"] floatValue];
           NSString *distance=[stationEnCours objectForKey:@"distance"];
           NSLog(@"distance: %.1f",distance);
           float lng = [[stationEnCours objectForKey:@"ssiphone_longitude"] floatValue];
           float lat = [[stationEnCours objectForKey:@"ssiphone_latitude"] floatValue];
           NSString *ensStation=[stationEnCours objectForKey:@"ssiphone_enseigne"];

           //CLLocationCoordinate2D location2D= {.latitude = lat, .longitude = lng};
           location2D = (CLLocationCoordinate2D){ .latitude = lat, .longitude = lng };
           MyLocation *annotation=[[[MyLocation alloc]initWithName:ensStation distanceVersLaStation:distance coordinate:location2D]autorelease];
           [mapView addAnnotation:annotation];
          // MKCoordinateSpan span={latitudeDelta:0.2,longitudeDelta:0.2};
          // MKCoordinateRegion region={location2D,span};
           //[mapView setRegion:region];
           //[self.view addSubview:mapView];

           }
           MKCoordinateSpan span={latitudeDelta:0.2,longitudeDelta:0.2};
           MKCoordinateRegion region={location2D,span};
           [mapView setRegion:region];
           [self.view addSubview:mapView];

стек исключений:

2011-05-05 13:26:04.518[786:207] -[NSDecimalNumber stringByStandardizingWhitespace]: unrecognized selector sent to instance 0x6e6dca0
2011-05-05 13:26:04.520[786:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSDecimalNumber stringByStandardizingWhitespace]: unrecognized selector sent to instance 0x6e6dca0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02915919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0272a5de objc_exception_throw + 47
    2   CoreFoundation                      0x0291742b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02887116 ___forwarding___ + 966
    4   CoreFoundation                      0x02886cd2 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x00451608 -[UICalloutView setSubtitle:animated:] + 88
    6   UIKit                               0x004512d8 -[UICalloutView setSubtitle:] + 49
    7   MapKit                              0x023849de -[MKAnnotationContainerView _showBubbleForAnnotationView:bounce:scrollToFit:userInitiated:avoid:] + 527
    8   MapKit                              0x02385735 -[MKAnnotationContainerView _setSelectedAnnotationView:bounce:pressed:scrollToFit:userInitiated:avoid:] + 651
    9   MapKit                              0x0237fb78 -[MKAnnotationContainerView _setSelectedAnnotationView:bounce:pressed:scrollToFit:userInitiated:] + 144
    10  MapKit                              0x0235a891 -[MKMapView handleTap:] + 459
    11  UIKit                               0x005a2394 -[UIGestureRecognizer _updateGestureWithEvent:] + 727
    12  UIKit                               0x0059ebf3 -[UIGestureRecognizer _delayedUpdateGesture] + 47
    13  UIKit                               0x005a3486 _UIGestureRecognizerUpdateObserver + 637
    14  CoreFoundation                      0x028f6d1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27
    15  CoreFoundation                      0x0288b987 __CFRunLoopDoObservers + 295
    16  CoreFoundation                      0x02854c17 __CFRunLoopRun + 1575
    17  CoreFoundation                      0x02854280 CFRunLoopRunSpecific + 208
    18  CoreFoundation                      0x028541a1 CFRunLoopRunInMode + 97
    19  GraphicsServices                    0x02e8e2c8 GSEventRunModal + 217
    20  GraphicsServices                    0x02e8e38d GSEventRun + 115
    21  UIKit                               0x0033ab58 UIApplicationMain + 1160
    22  myApp                         0x000021f8 main + 102
    23  myApp                          0x00002189 start + 53
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
(gdb) 

ИЗМЕНИТЬ 1:

два NSLogs:

NSLog(@"distance: %@", [distance class]);
           NSLog(@"ensStation: %@", [ensStation class]);

внутри цикла for покажите мне, что:

2011-05-05 13:38:01.223 myApp[856:207] distance: NSCFNumber
2011-05-05 13:38:01.223 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.224 myApp[856:207] distance: NSDecimalNumber
2011-05-05 13:38:01.224 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.225 myApp[856:207] distance: NSDecimalNumber
2011-05-05 13:38:01.225 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.225 myApp[856:207] distance: NSDecimalNumber
2011-05-05 13:38:01.225 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.225 myApp[856:207] distance: NSDecimalNumber
2011-05-05 13:38:01.226 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.226 myApp[856:207] distance: NSCFNumber
2011-05-05 13:38:01.226 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.226 myApp[856:207] distance: NSDecimalNumber
2011-05-05 13:38:01.227 myApp[856:207] ensStation: NSCFString
2011-05-05 13:38:01.227 myApp[856:207] distance: NSDecimalNumber
2011-05-05 13:38:01.227 myApp[856:207] ensStation: NSCFString
(gdb) 

Редактировать 2: Еще раз привет, проблема с аннотацией исправлена, но я думаю, что получил то же самое исключение, когда я вышел и вернулся к представлению:

2011-05-05 14:56:47.374 TopStation[1234:207] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x806b620> was mutated while being enumerated.(
    "<MyLocation: 0x806c910>",
    "<MyLocation: 0x806c7e0>",
    "<MyLocation: 0x806c930>",
    "<MyLocation: 0x806c9d0>",
    "<MyLocation: 0x806ca20>",
    "<MyLocation: 0x806cc40>",
    "<MyLocation: 0x806c990>"
)'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02915919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0272a5de objc_exception_throw + 47
    2   CoreFoundation                      0x029153d9 __NSFastEnumerationMutationHandler + 377
    3   TopStation                          0x00005691 -[StationsSurLaCarteViewController requestFinished:] + 343
    4   TopStation                          0x00019597 -[ASIHTTPRequest reportFinished] + 171
    5   Foundation                          0x000abe9a __NSThreadPerformPerform + 251
    6   CoreFoundation                      0x028f6d7f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    7   CoreFoundation                      0x028552cb __CFRunLoopDoSources0 + 571
    8   CoreFoundation                      0x028547c6 __CFRunLoopRun + 470
    9   CoreFoundation                      0x02854280 CFRunLoopRunSpecific + 208
    10  CoreFoundation                      0x028541a1 CFRunLoopRunInMode + 97
    11  GraphicsServices                    0x02e8e2c8 GSEventRunModal + 217
    12  GraphicsServices                    0x02e8e38d GSEventRun + 115
    13  UIKit                               0x0033ab58 UIApplicationMain + 1160
    14  TopStation                          0x00002188 main + 102
    15  TopStation                          0x00002119 start + 53
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
(gdb) 

РЕДАКТИРОВАТЬ 3: Еще раз привет, я должен очищать карту от аннотаций каждый раз, когда вид появляется, поэтому я сделал это (непосредственно перед отображением аннотаций на карте:

if(request.responseStatusCode==200)
   {   

       for (id<MKAnnotation> annotation in mapView.annotations) {
          [mapView removeAnnotation:annotation];
       }
       //parse the response
           //...

поэтому исключение было связано с этим for``loop, я удалил его из кода, и все работает нормально, однако мне действительно не нужно очищать карту от аннотаций каждый раз, когда отображается вид, есть ли другая альтернатива для этого ?? спасибо заранее :)


person Luca    schedule 05.05.2011    source источник
comment
setRegion и особенно addSubview внутри цикла for не имеют смысла. Является ли mapView IBOutlet или создается программно? Кроме того, что является точным исключением?   -  person    schedule 05.05.2011
comment
Привет, пожалуйста, посмотрите на мое редактирование, я исправил ваши точки.   -  person Luca    schedule 05.05.2011
comment
В цикле for после строки NSString *ensStation=... добавьте эти два NSLog и сообщите нам, что там написано: NSLog(@"distance: %@", [distance class]); NSLog(@"ensStation: %@", [ensStation class]);   -  person    schedule 05.05.2011
comment
я забыл сказать вам, что mapView - это IBOutlet, и он правильно подключен к владельцу файла :)   -  person Luca    schedule 05.05.2011
comment
Привет, я отредактировал свой пост, он показывает мне что-то вроде NSCFNumber, и если бы я хотел отобразить значение с плавающей запятой distance, это было бы 0,000000   -  person Luca    schedule 05.05.2011
comment
Рад, что исправление сработало. Кстати, если это IBOutlet, вам не нужно вызывать addSubview.   -  person    schedule 05.05.2011


Ответы (1)


Проблема в этой строке:

NSString *distance=[stationEnCours objectForKey:@"distance"];

Согласно NSLogs, объект «расстояние» в stationEnCours представляет собой NSDecimalNumber (а не NSString). Затем вы передаете его initWithAnnotation, который предполагает, что это NSString.

Когда представление карты пытается отобразить всплывающую подсказку, оно также предполагает, что подзаголовок является NSString, и пытается вызвать для него stringByStandardizingWhitespace, но терпит неудачу (поскольку на самом деле это NSDecimalNumber).

Попробуйте изменить приведенную выше строку на:

NSString *distance = [NSString stringWithFormat:@"%f", 
    [(NSDecimalNumber *)[stationEnCours objectForKey:@"distance"] doubleValue]];
person Community    schedule 05.05.2011
comment
Привет еще раз, то же самое исключение выдается, когда я выхожу из представления, а затем возвращаюсь к нему :( может ли это быть утечка управления памятью, должен ли я освободить массив, используемый в цикле for? однако я не выделил/инициализировал его - person Luca; 05.05.2011
comment
Не нужно освобождать массив. Это точно такое же исключение? Раньше это происходило, когда вы нажимали аннотацию. Теперь вы получаете исключение при выходе из представления. - person ; 05.05.2011
comment
Привет, Анна, я отредактировал свой пост, я думаю, это то же самое исключение, и я действительно сомневаюсь в том, что память освобождает объекты, что вы думаете? :) - person Luca; 05.05.2011
comment
Это другое исключение (... мутировало при перечислении вместо... нераспознанного селектора, отправленного экземпляру) с другой причиной. Есть ли у вас какой-либо другой код в методе requestFinished (например, цикл for (... in ...))? - person ; 05.05.2011
comment
Привет, Анна, я отредактировал свой пост, на самом деле проблема была в другом цикле for, который очищает карту от предыдущих аннотаций, чтобы начать работать с очищенной картой каждый раз, когда появляется вид, поэтому мне нужно выполнить эту задачу, это очень важно для моего случая, есть ли альтернатива, которую я могу сделать? спасибо заранее :) - person Luca; 05.05.2011
comment
Этот цикл пытается изменить массив, через который он проходит, что не разрешено. Вместо этого вы можете использовать это: [mapView removeAnnotations:mapView.annotations]; (обратите внимание, что оно вызывает множественное число removeAnnotations вместо единственного числа removeAnnotation). Однако это также удалит аннотацию о местоположении пользователя, если у вас включена функция showUserLocation. Если это так, вам сначала нужно пройтись по массиву mapView.annotations и добавить аннотации, отличные от MKUserLocation, в другой массив annotsToRemove, а затем вызвать removeAnnotations с помощью annotsToRemove. - person ; 05.05.2011
comment
Ответы на этот вопрос показать, что я имею в виду об исключении MKUserLocation, если это необходимо. - person ; 05.05.2011