在 iOS 6 中工作,我似乎无法让地图视图自行更新以显示添加或删除的标记。
当应用程序打开时,地图上会放置许多标记。然后用户可以做出添加新标记和/或移除现有标记的选择。这使用与在 viewWillLoad 填充 RMMarkerManager 时相同的方法,我可以遍历 RMMarkerManager 中的标记并查看它具有新的标记集,但地图视图永远不会更新以显示它们。
我试过 [mapview setNeedsDisplay] 没有效果。
很明显,我遗漏了一些导致地图视图更新标记显示的东西,但我还没有弄清楚是什么,尽管有很多令人头疼的问题和文件和帖子的挖掘。
对于我应该更改或添加的内容,我将不胜感激。
根据要求,这是适当的代码。我将解释它是如何工作的。
在 viewController 的createMarkers
方法中,标记是通过访问 sqlite 数据库来创建的。为我希望在地图上显示为标记的每条记录创建一个标记。然后我遍历标记数组,将每个标记添加到 mapView 的 marketManager(addMarker
方法)。该方法createMarkers
在 viewController 的viewWillLoad
方法中调用,并且工作正常:显示所有标记。
使用该应用程序时,用户可以选择或取消选择数据库中的记录。然后 viewController 收到用户更改选择的通知,并调用它的setMarkers
方法。mapview 的marketmanager 收到removeMarkers 消息,然后重新创建marker 数组;它现在具有反映用户选择的标记。但是地图从不更新视图标记。用户移除的标记不会在视图上移除;不添加用户添加的标记。
更新后,我可以遍历 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 的 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
视图控制器中的方法: 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 ];
}