我正在寫一個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語句,所以我知道它被調用。這完全沒有意義。
任何有識之士將不勝感激。
乾杯,
佈雷特