2011-12-23 10 views
0

都市&の状態情報をMKAnnotationに追加しようとしていますが、データをクリアしてからアノテーションに追加できません。ここで私の現在のコードは、(だけ簡単にするために関心のセクション/部品を示す)である:実装でCLGeocoderを使用してMKAnnotationに市区町村の情報を追加する

:界面における

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{  
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init]; 
    [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { 
    CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
    [self setCity:[placemark locality] andState:[placemark administrativeArea]]; 
    }]; 

    NSLog(@"Location 1: %@, %@", city, state); 

    MapPoint *mp = [[MapPoint alloc] initWithCoordinate:[newLocation coordinate] 
                title:[locationTitleField text] 
                date:[dateFormat stringFromDate:today]]; 

    [mapView addAnnotation:mp]; 
} 

- (void)setCity:(NSString *)c andState:(NSString *)s 
{ 
    [self setCity:c]; 
    [city retain]; 
    [self setState:s]; 
    [state retain]; 
    NSLog(@"Location 2: %@, %@", city, state); 
} 

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate> 
{ 
    CLLocationManager *locationManager; 
    IBOutlet MKMapView *mapView; 
    NSString *city; 
    NSString *state; 
} 

@property (strong, nonatomic) IBOutlet UIWindow *window; 
@property (nonatomic, copy) NSString *city; 
@property (nonatomic, copy) NSString *state; 

- (void)setCity:(NSString *)c andState:(NSString *)s; 

@end 

ロケーション1つの印刷(NULL)、( null)、Location 2はカリフォルニア州サンフランシスコを印刷します。注釈で使用する前に、これらのプロパティからデータが消去されるのはなぜですか?

ありがとう...

+0

ここで、MKAnnotationを設定しますか? –

+0

MKAnnotationの設定位置を示すコードをいくつか追加しました。クラスMapPointは、MKAnnotationプロトコルに準拠しています。日付のことについて心配しないでください。注釈を付ける前に街と州を得ることができれば、それを副題に追加します。 –

+0

それは問題を説明します。私の答えの更新されたセクションを参照してください。 –

答えて

1

場所1がヌルである理由は、それが実行されると、逆ジオコーダが完了していないということです。 completionHandlerのすべてが、の後にになります。ジオコーダーが終了します。ロケーション1のログステートメントは、completionHandlerの一部ではなく、逆ジオコードの呼び出しの直後に実行されます。最終的には、の前にログの呼び出しが発生し、と呼ぶ前にが呼び出されます。

更新

あなたはcompletionHandlerブロックに注釈を設定する必要があります。ブロック内で発生するコードは、メッセージの実装の残りの部分よりも後でシーケンスと時間に発生します。 read about blocks from Apple's documentationやインターネットを検索することもできます。

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{  
    CLGeocoder * geoCoder = [[CLGeocoder alloc] init]; 
    [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     [self setCity:[placemark locality] andState:[placemark administrativeArea]]; 
     MapPoint *mp = [[MapPoint alloc] initWithCoordinate:[newLocation coordinate] 
                 title:[locationTitleField text] 
                 date:[dateFormat stringFromDate:today]]; 
     [mapView addAnnotation:mp]; 
    }]; 
} 

エンド更新

あなたが同様にあなたができる限りのプロパティを使用していない可能性があるかのようにまた、それが見えます。 citystateというプロパティがあるので、citystateのインスタンス変数は必要ありません。

は、そのように変更してください:

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate> 
{ 
    CLLocationManager *locationManager; 
    IBOutlet MKMapView *mapView; 
} 

実装では:

@synthesize city, state 
... 
- (void)setCity:(NSString *)c andState:(NSString *)s 
{ 
    [self setCity:c]; 
    [self setState:s]; 
    NSLog(@"Location 2: %@, %@", city, state); 
} 

あなたは、プロパティのコピーために余分な保持文値を必要としません。値を取得するには、必ずself.cityself.stateに電話する必要があります。

+0

そうした余計なデータは、データが消去されないようにするためのものです。では、私はMKAnnotationで使用する市と州の情報をどのように入手できますか? completionHandlerブロックは、どのように構造化しても、コード内で実行される最後のものです。 –

+0

私の更新された回答を参照してください。 –

+0

ありがとう、David。私は街と州のプロパティを気にしないで終わった。私はMapPointに情報を送信しました。[NSString stringWithFormat:@ "%@、%@"、[placemark locality]、[placemark administrativeArea]]; –

関連する問題