2013-05-08 106 views
0

在iOS 6中工作時,我似乎無法使地圖視圖更新自身以顯示添加或刪除的標記。在Route-me地圖上重繪標記

當應用程序打開時,地圖上會放置一些標記。用戶然後可以做出添加新標記和/或刪除現有標記的選擇。這使用與在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 

#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,它是從一個源碼數據庫填充:

// 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 2013-05-08 15:33:53

+0

請給出更好的解釋。使用addAnnotation/removeAnnotation總是爲我做。 – 2013-05-08 15:34:02

+0

添加了代碼和註釋。 – johnz 2013-05-08 21:14:51

回答

0

這裏的問題的行是setMarkers

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

製作markers一個實例變量,並在該類的viewWillLoad方法中執行alloc-init更正問題。

我希望我能更好地解釋這一點,但我不確定爲什麼會導致問題。但是,它現在已經得到糾正,我會在我有一些時間的時候進行探索。