Перерисовывание маркеров на карте Route-me

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

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

Я попытался [mapview setNeedsDisplay] без эффекта.

Ясно, что мне не хватает чего-то, что заставляет картографическое отображение обновлять отображение маркеров, но я так и не выяснил, что, несмотря на множество царапин и копаний в документациях и постах.

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

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

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

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

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

Класс: Маркер, подкласс RMMarker. Просто хранит данные о маркере для отображенияMarker.h:

//  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

Класс: Markers Содержит NSMutableArray of Markers, который заполняется из базы данных 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 ];
    }

1 ответ

Оскорбительная строка здесь находится в setMarkers:

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

Изготовление markers переменная экземпляра и делает alloc-init в классе viewWillLoad Метод исправил проблему.

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

Другие вопросы по тегам