重新绘制Route-me地图上的标记

时间:2013-05-08 15:31:55

标签: ios route-me

在iOS 6中工作,我似乎无法让地图视图更新自己以显示添加或删除的标记。

当应用程序打开时,会在地图上放置许多标记。然后,用户可以做出添加新标记和/或移除现有标记的选择。这使用与在viewWillLoad中填充RMMarkerManager时相同的方法,并且我可以遍历RMMarkerManager中的标记并看到它具有新的标记集,但地图视图永远不会更新以显示它们。

我试过[mapview setNeedsDisplay]没有效果。

很明显,我错过了导致mapview更新标记显示的内容,但我还没弄清楚是什么,尽管有很多令人头疼的问题,并且正在通过文档和帖子进行挖掘。

对于我应该更改或添加的内容,我将不胜感激。

根据要求,这是适当的代码。我将解释它是如何工作的。

在viewController的createMarkers方法中,通过访问sqlite数据库来创建标记。为每个我希望在地图上显示为标记的记录创建一个标记。然后我遍历标记数组,将每个标记添加到mapView的marketManager(addMarker方法)中。方法createMarkers在viewController的viewWillLoad方法中调用,并且正常工作:显示所有标记。

使用应用程序时,用户可以选择或取消选择数据库中的记录。然后viewController接收用户更改了选择的通知,并调用其setMarkers方法。 mapview的marketmanager获取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

课程:标记 持有一个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 Markers迭代,为该数组中的每个标记调用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 最后,用于向RMMarkerManager添加标记的addMarker方法:

- (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 个答案:

答案 0 :(得分:0)

此处的违规行位于setMarkers

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

使markers实例变量并在类的viewWillLoad方法中执行alloc-init更正了问题。

我希望我能更好地解释这一点,但我不确定为什么会导致这个问题。但是,它现在已得到纠正,我会在有空的时候探索。