2013-05-08 3 views
0

Работая в iOS 6, я не могу получить представление карты, чтобы обновить себя, чтобы показать добавленные или удаленные маркеры.Перерисовывая маркеры на карте Route-me

Когда приложение открывается, на карте помещается ряд маркеров. Затем пользователь может делать выбор, который добавляет новые маркеры и/или удаляет существующие маркеры. Это использует тот же метод, что и когда RMMarkerManager заполняется в viewWillLoad, и я могу выполнять итерацию по маркерам в RMMarkerManager и видеть, что у него есть новый набор маркеров, но отображение карты никогда не обновляется, чтобы показать их.

Я попробовал [mapview setNeedsDisplay] без эффекта.

Очевидно, что я пропускаю что-то, что заставляет mapview обновлять отображение маркеров, но я не понял, что, несмотря на много царапин и царапин на документах и ​​сообщениях.

Буду признателен за любые предложения относительно того, что я должен изменить или добавить.

В соответствии с запросом, вот соответствующий код. Я объясню, как это работает.

В методе viewController createMarkers маркеры создаются путем обращения к базе данных sqlite. Один маркер создается для каждой записи, которую я хочу отображать как маркер на карте. Затем я перебираю массив маркеров, добавляя их в mapManager mapView (метод addMarker). Метод createMarkers вызывается в методе viewController viewWillLoad и работает корректно: отображаются все маркеры.

При использовании приложения пользователь может выбрать или удалить записи в базе данных. Затем viewController получает уведомление о том, что пользователь изменил выбор, и вызывает его метод setMarkers. Маркер-менеджер mapview получает сообщение removeMarkers, затем массив маркеров воссоздается; теперь он имеет маркеры, отражающие выбор пользователя. Но карта никогда не обновляет маркеры на экране. Маркеры, удаленные пользователем, не удаляются в представлении; добавленные пользователем маркеры не добавляются.

После обновления я могу выполнить итерацию через mapview.markermanager.markers и увидеть, что теперь он содержит новые маркеры. Но они никогда не отображаются на mapView.

Класс: Маркер, подкласс RMMarker. Просто хранится информация о маркере, который будет отображаться Маркер.ч:

// Marker.h 

#import <Foundation/Foundation.h> 
#import "Location.h" 
#import "RMMarker.h" 

@interface Marker : RMMarker { 
    NSString *category_name; 
    NSString *name; 
    NSString *desc; 
    NSString *address; 
    NSString *png; 
    int marker_id; 
    float lat; 
    float longi; 
    CLLocationCoordinate2D node; 
    float label_x_offset; 
    float label_y_offset; 
} 
@property (nonatomic, strong) NSString *category_name; 
@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSString *desc; 
@property (nonatomic, retain) NSString *address; 
@property (nonatomic, retain) NSString *png; 
@property (nonatomic) int marker_id; 
@property (nonatomic) float lat; 
@property (nonatomic) float longi; 
@property (nonatomic) CLLocationCoordinate2D node; 
@property (nonatomic) float label_x_offset; 
@property (nonatomic) float label_y_offset; 

@end 

Класс: Маркеры Имеет степень NSMutableArray маркеров, который заполняется из Sqlite базы данных:

// Markers.m 

#import "Markers.h" 
#import "defs.h" 
#import "FileLocator.h" 
#import "Marker.h" 

@implementation Markers 
@synthesize markers; 

-(NSMutableArray *) createMarkers {   
    markers = [[NSMutableArray alloc] init]; 

    [self openDatabase]; 

    NSString *query = [NSString stringWithFormat:@"SELECT categories.selected, categories.category_id, categories.png, places.name, address, description, latitude, longitude, place_id FROM places, categories WHERE (categories.selected = 1 AND places.category_id = categories.category_id);"]; 

    debugPrintArgs(@"query: %@", query); 
    FMResultSet *rs = [db executeQuery:query]; 
    while ([rs next]) { 
     Marker *marker = [[Marker alloc] init]; 
     marker.marker_id = [rs intForColumn:@"place_id"]; 
     marker.name = [rs stringForColumn:@"name"]; 
     marker.address = [rs stringForColumn:@"address"]; 
     marker.desc = [rs stringForColumn:@"description"]; 
     marker.lat = [rs doubleForColumn:@"latitude"]; 
     marker.longi = [rs doubleForColumn:@"longitude"]; 
     marker.png = [rs stringForColumn:@"png"]; 
     debugPrintArgs(@"%@, %@, %@, %f, %f", marker.name, marker.address, marker.description, marker.lat, marker.longi); 
     marker.label_y_offset = 150.0f; 
     marker.label_x_offset = 30.0f; 
     [markers addObject:marker]; 
    } 

    [db close]; 
    return markers; 
} 

@end  

Методы в ViewController: setMarkers: Перебирает маркеры NSMUtableArray, вызывая метод addMarker: для каждого маркера в этом массиве:

- (void) setMarkers { 

// class Markers is essentially an NSMutableArray that holds instantiations of Marker - one for each marker to be displayed 
// Markers is also responsible for populating itself from a sqlite database via the createMarkers method 
    Markers *markers = [[Markers alloc] init]; 
    NSMutableArray *allMarkers = [markers createMarkers]; 

// allMarkers contains the markers to be displayed. 

    CLLocationCoordinate2D loc; 
    if ([allMarkers count] > 0) { 
     for (Marker *mrkr in allMarkers) { 
      loc.longitude = mrkr.longi; 
      loc.latitude = mrkr.lat ; 
      [self addMarker: mrkr at:loc withText:mrkr.name xOffset: mrkr.label_x_offset yOffset: mrkr.label_y_offset png: mrkr.png]; 
     } 
    } 
} 

Также в ViewController: addMarker И, наконец, метод addMarker используется для добавления маркеров в RMMarkerManager:

- (void) addMarker: (Marker *) marker at:(CLLocationCoordinate2D)loc withText:(NSString *)text xOffset: (float) x_offset yOffset:(float) y_offset png:(NSString *) png { 

    UIImage* markerImage = [UIImage imageNamed:png]; 
    [marker replaceUIImage:markerImage anchorPoint:CGPointMake(0.38f, 1.08f)]; 

    [viewMap.markerManager addMarker: marker AtLatLong: loc]; 

    CGPoint position = CGPointMake( 0.0f, 0.0f); 

    [marker changeLabelUsingText: text position: position ]; 
    } 
+0

Опубликовать код, показывающий, как добавляются аннотации к карте. – Wain

+0

Пожалуйста, объясните причину, что вы делаете. Использование addAnnotation/removeAnnotation всегда делало это для меня. –

+0

Добавлен код и комментарии. – johnz

ответ

0

Нарушитель линия здесь находится в setMarkers:

Markers *markers = [[Markers alloc] init]; 

Выполнение markers переменной экземпляра и выполнение alloc-init в методе viewWillLoad класса исправлено проблема.

Хотел бы я объяснить это лучше, но я не уверен, почему это вызвало проблему. Но теперь это исправлено, и я буду исследовать, когда у меня есть время.

Смежные вопросы