0

都市と州の情報を 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) を印刷し、場所 2 はカリフォルニア州サンフランシスコを印刷します。アノテーションで使用する前に、これらのプロパティからデータが消去されるのはなぜですか?

どうもありがとう...

4

1 に答える 1

1

ロケーション1がnullである理由は、逆ジオコーダーの実行時に逆ジオコーダーが完了していないためです。ジオコーダーが終了すると、すべてcompletionHandlerが発生します。ロケーション1のログステートメントはその一部ではなくcompletionHandler、逆ジオコードの呼び出しの直後に実行されます。最終的には、を呼び出す前にログ呼び出しが発生しますsetCity:andState:

アップデート

completionHandlerブロックに注釈を設定する必要があります。ブロック内で発生するコードは、locationManager:didUpdateToLocation:fromLocation:メッセージ実装の残りの部分よりもシーケンスと時間の後半で発生します。Appleのドキュメントからブロックについて読んだり、インターネットを検索したりすることをお勧めします。

- (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];
    }];
}

更新を終了

また、プロパティを十分に使用していないように見えます。cityandプロパティがあるので、 andインスタンス変数stateは必要ありません。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値を取得する必要があります。

于 2011-12-23T02:26:44.163 に答える