Работая в 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 ];
}
Опубликовать код, показывающий, как добавляются аннотации к карте. – Wain
Пожалуйста, объясните причину, что вы делаете. Использование addAnnotation/removeAnnotation всегда делало это для меня. –
Добавлен код и комментарии. – johnz