2010-10-19 44 views
1

我正在寫一個iPad應用程序(操作系統3.2),它使用MKMapKit在地圖上顯示移動註釋。信息通過XML從三個不同的資源中檢索出來,並在我的Annotation類中整理在一起,然後顯示在Map上。這些信息每5秒鐘發佈一次。我有這個工作好幾個月,我的註釋按要求移動。iOs爲什麼我必須實現setCoordinate才能讓我的註釋在MKMapKit中移動?

以下所有代碼都是代碼的近似值(不能發佈我公司的確切代碼),並且它是逐行輸入的,因此它不會被編譯。

我的註釋代碼看起來是這樣的:

@interface MyFunkyAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinated2D coordinate; 
    NSString *identifier; 
    // Lots of other fields that can be displayed. 
} 
@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, retain) NSString *identifier; 

// Lots of other properties as above. 
-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky; 

@end 

然後在我執行我有這樣的東西:

@implementation MyFunkyAnnotation 

@synthesize coordinate; 

-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky 
{ 
    [self setCoordinate:[newFunky coordinate]]; 
    [self setIdentifier:[newFunky identifier]]; 
    // Lots more updating of various properties. 
} 
@end 

這個工作很大,所以我當然決定重新設計整個事情,將大量信息封裝到其他類中。

所以現在我的代碼如下:

@interface MyFunkyAnnotation: NSObject <MKAnnotation> 
{ 
    SourceInfo_1 *source1; // Contains its own coordinate property; 
    SourceInfo_2 *source2; // Contains its own coordinate property; 
    SourceInfo_3 *source3; // Contains its own coordinate property; 
} 
@property (nonatomic, retain) SourceInfo_1 *source1; 
@property (nonatomic, retain) SourceInfo_2 *source2; 
@property (nonatomic, retain) SourceInfo_3 *source3; 

-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky; 
-(CLLocationCoordinate2D)coordinate; 

@end 

新的實現:

@implementation MyFunkyAnnotation 

@synthesize source1, source2, source3; 

-(CLLocationCoordinate2D)coordinate 
{ 
    if ([source1 dataReliable] == YES) 
    { 
     return [source1 coordinate]; 
    } 
    else if ([source2 dataReliable] == YES) 
    { 
     return [source2 coordinate]; 
    } 
    else 
    { 
     return [source3 coordinate]; 
    } 
} 

-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky; 
{ 
    if ([newFunky source1] != nil) 
    { 
     [self setSource1:[newFunky source1]; 
    } 
    if ([newFunky source2] != nil) 
    { 
     [self setSource2:[newFunky source2]; 
    } 
    if ([newFunky source3] != nil) 
    { 
     [self setSource3:[newFunky source3]; 
    } 
} 
@end; 

運行這個新代碼導致的註釋在原來的位置被添加,但他們從來沒有移動在所有。當我得到XML提要時,我正在更新source1,source2,source3內部的座標。

因此,經過一整天的調試和嘗試各種事情,我得到它的工作。然後,我開始刪除我在一天中添加的所有內容,以便進行以下微小更改以使其正常工作,結果非常奇怪:

接口未修改。 在執行我添加一個方法,並增加了其他三條線:

@implementation MyFunkyAnnotation 

@synthesize source1, source2, source3; 

-(void)setCoordinate:(CLLocationCoordinate2D)coordinate // <-- New method 
{ 
    nil; 
} 

-(CLLocationCoordinate2D)coordinate 
{ 
    if ([source1 dataReliable] == YES) 
    { 
     return [source1 coordinate]; 
    } 
    else if ([source2 dataReliable] == YES) 
    { 
     return [source2 coordinate]; 
    } 
    else 
    { 
     return [source3 coordinate]; 
    } 
} 

-(void)updateFunkyAnnotationWithNewAnnotation:(MyFunkyAnnotation*)newFunky; 
{ 
    if ([newFunky source1] != nil) 
    { 
     [self setSource1:[newFunky source1]; 
     [self setCoordinate:[[newFunky source1] coordinate]]; // <--- New Line 
    } 
    if ([newFunky source2] != nil) 
    { 
     [self setSource2:[newFunky source2]; 
     [self setCoordinate:[[newFunky source2] coordinate]]; // <--- New Line 
    } 
    if ([newFunky source3] != nil) 
    { 
     [self setSource3:[newFunky source3]; 
     [self setCoordinate:[[newFunky source3] coordinate]]; // <--- New Line 
    } 
} 
@end; 

任何人都可以解釋爲什麼需要調用它實際上並沒有做任何事情的方法。 「無」是一個NSLog語句,所以我知道它被調用。這完全沒有意義。

任何有識之士將不勝感激。

乾杯,

佈雷特

回答

2

我的猜測是,這事做與不執行協調屬性。來自MKAnnotation協議文檔。

採用該協議的對象必須實現座標屬性。

也許由於您沒有座標屬性,您需要setCoordinate方法才能正確處理註釋。

你有沒有嘗試添加

@synthesize coordinate; 

您的.m文件?假設你的頭文件中仍然有屬性聲明?

您可能需要在屬性聲明中專門設置getter方法。類似於

@property (nonatomic, assign, getter=getCoordinate) CLLocationCoordinate2D coordinate; 

然後將您的座標方法重命名爲getCoordinate。

注意:可以避免使用getter屬性並更改座標存取器名稱,但我沒有測試過。

0

setCoordinate:

設置註釋的新中心點。 - (空)setCoordinate:(CLLocationCoordinate2D)newCoordinate 參數

newCoordinate

The new center point for the annotation. 

討論

支持拖動應該實現此方法來更新標註的位置註解。 可用性

**Available in iOS 4.0 and later.** 

宣佈 MKAnnotation.h

相關問題