0

ObjCについての理解が不足しているという小さな問題があります。

ルートメニューと別のビュー(地図)に接続するボタンを備えた小さなアプリを作成しました。私の問題は、地図が読み込まれるときに地図のデフォルトの場所を設定することです。MapViewController.m内のコードに、次の関数を含めました。

    - (void)viewWillAppear:(BOOL)animated {
    CLLocationCoordinate2D zoomLocation;
    zoomLocation.longitude= desired_longitude;
    zoomLocation.latitude = desired_latitude;

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 4*METERS_PER_MILE, 4*METERS_PER_MILE);

    [self.mapOutlet setRegion:viewRegion animated:YES];}

さて、最初にアプリを実行してルートメニューの地図ボタンを押すと、地図は大西洋のどこかに中央に配置されます。しかし、ルートメニューに戻ってマップボタンをもう一度押すと、マップは目的の場所の中央に配置されます。このコードをviewDidLoadメソッド内に入れてみたところ、同じ結果になりました。

誰かがこれを解決する方法、そしてもっと重要なことに、これがどのように機能するかを私に説明できますか?新しいビューが表示されたときに呼び出されるメソッドはどれですか?たとえば、実装ファイルに上記のメソッドを含めるだけで、このメソッドを呼び出さずに実行されるのは不思議に思えます(現時点では、マップビューへの2回目のナビゲーションの後でのみですが)...

4

1 に答える 1

0

-(void)viewWillAppear:(BOOL)animatedから継承されたメソッドですUIViewController。ビューが表示されるたびに呼び出されます。これが、コードを呼び出さずに実行する理由です。コードは、iOSのビューおよび関連するコントローラー実装の一部として呼び出されます。

これは、MKMapViewを内部のデフォルトの場所に設定するために使用するコードですviewWillAppear

#define kMapDeltaLat 0.586746
#define kMapDeltaLon 0.878906

@interface MapViewController ()
//other properties here
@property bool firstDisplay;
@end

...
- (void)viewWillAppear:(BOOL)animated
{
    if (self.firstDisplay) {
        //zoom in and set the region where we want
        MKCoordinateRegion region;
        MKCoordinateSpan span;
        region.center = self.map.region.center;
        span.latitudeDelta = kMapDeltaLat;
        span.longitudeDelta = kMapDeltaLon;
        region.span = span;
        [self.map setRegion:region animated:NO];
        CLLocationCoordinate2D myLoc = CLLocationCoordinate2DMake(50.245, -1.787);
        [self.map setCenterCoordinate:myLoc animated:YES];
        self.firstDisplay = NO;
    }
}

マップの領域は、そのビューがどのように見えるか(つまり、マップがどの程度拡大されているか)を定義します。中心座標は、マップが現在配置されている場所を定義します。

于 2013-03-05T13:20:45.803 に答える