8

だから今、私は少なくとも次のコードでコールバックを取得しています...

- (void)viewDidLoad {

[super viewDidLoad];
mapView=[[MKMapView alloc] initWithFrame:self.view.frame];
//mapView.showsUserLocation=TRUE;
mapView.delegate=self;
[self.view insertSubview:mapView atIndex:0];

NSLog(@"locationServicesEnabled: %@", [CLLocationManager locationServicesEnabled] ? @"YES":@"NO");
    CLLocationManager *newLocationManager = [[CLLocationManager alloc] init];
    [newLocationManager setDesiredAccuracy:kCLLocationAccuracyBest];
    [newLocationManager setDistanceFilter:kCLDistanceFilterNone];
    [self setLocationManager:newLocationManager];


[[self locationManager] setDelegate:self];
[[self locationManager] startUpdatingLocation];
NSLog(@"Started updating Location");

}


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

NSLog(@"Did update to location");
mStoreLocationButton.hidden=FALSE;
location=newLocation.coordinate;

MKCoordinateRegion region;
region.center=location;
MKCoordinateSpan span;
span.latitudeDelta=0.01;
span.longitudeDelta=0.01;
region.span=span;


[mapView setRegion:region animated:TRUE];


}

2 番目の方法でブレークポイントを設定でき、NSLog は継続的な位置情報の更新を報告していますが、何らかの理由でスパンによるズームが機能していません。理由はありますか?それは私の座標とすべてを持っています。これについて頭を悩ませているようなものです。

4

7 に答える 7

16

CLLocationManager をクラスの (強力な) プロパティに割り当てます。(ARC BTWを使用していると思います。)現在、CLLocationManagerはviewDidLoadメソッドの終わりを過ぎて生きていないため、デリゲートメソッドも呼び出すことができません。

于 2012-07-28T14:38:22.563 に答える
14

<CLLocationManagerDelegate>ファイルに追加したことを確認し@interfaceます。

編集

デリゲートが適切に設定されている場合は、locationManagerプロパティを使用していることを確認してください。

.hファイル内:

@property (nonatomic, strong) CLLocationManager *locationManager;

viewDidLoad

self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager setDelegate:self];
[self.locationManager startUpdatingLocation];
于 2012-07-28T09:29:39.173 に答える
5

私は、あなたは2つの方法でこれを機能させることができると思います:

  1. CLLocation フレームワークの使用

CLLocationManagerDelegate メソッドで ViEWController を採用していることを確認してください

#import<MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate, 
                                              MKMapViewDelegate>
{
    CLLocationCoordinate2D location;
    MKMapView *mapView;
}
@end

ViewController.m で:

@implementation GSViewController
- (void)viewDidLoad {

    [super viewDidLoad];
    mapView=[[MKMapView alloc] initWithFrame:self.view.frame];
    mapView.showsUserLocation=TRUE;
    mapView.delegate=self;
    [self.view insertSubview:mapView atIndex:0];


    CLLocationManager *locationManager=[[CLLocationManager alloc] init];
    locationManager.delegate=self;
    locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;

    [locationManager startUpdatingLocation];

}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{


    NSLog(@"new location: %@", newLocation);
    location=newLocation.coordinate;

    MKCoordinateRegion region;
    region.center=location;
    MKCoordinateSpan span;
    span.latitudeDelta=0.01;
    span.longitudeDelta=0.01;
    region.span=span;

    [mapView setRegion:region animated:TRUE];

}


-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"error: %@", error.description);
}
@end

2.同じ MKMapKit フレームワークを使用する これは、didUpdateUserLocation という名前の MKMapViewDelegate メソッドを使用して行うことができます: ここでは CLLocaionManager は必要ありません。

#import <MapKit/MapKit.h>
@interface ViewController : UIViewController < MKMapViewDelegate>
{
    CLLocationCoordinate2D location;
    MKMapView *mapView;
}
@end

および ViewController.m ファイル内:

@implementation GSViewController
- (void)viewDidLoad {

    [super viewDidLoad];
    mapView=[[MKMapView alloc] initWithFrame:self.view.frame];
    mapView.showsUserLocation=TRUE;
    mapView.delegate=self;
    [self.view insertSubview:mapView atIndex:0];

}

-(void)mapView:(MKMapView *)mapV didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"map new location: %f %f", userLocation.coordinate.latitude, userLocation.coordinate.longitude);
    location=userLocation.coordinate;

    MKCoordinateRegion region;
    region.center=location;
    MKCoordinateSpan span;
    span.latitudeDelta=0.1;
    span.longitudeDelta=0.1;
    region.span=span;

    [mapV setRegion:region animated:TRUE];
}
@end
于 2012-07-28T06:13:21.373 に答える
1

これをシミュレーターでのみ実行している場合は、座標を変更するように求める必要があるかもしれません。Xcode では、デバッグ出力ペインの上に、典型的な位置情報サービスの矢印が付いたバーがあります。その横には、場所のドロップダウン リストがあります。アプリが実行されたら、シミュレートしている場所を切り替えて、その変更によってコードがトリガーされるかどうかを確認します。次に、実際のデバイスでテストします。

于 2012-07-28T14:18:17.003 に答える
1

まず第一に、ロケーション マネージャーがロケーションを最初から更新できるかどうかを確認することはできません。更新中にエラーが発生したか、ユーザーの場所にアクセスできない可能性があります。

この CLLocationManager デリゲート メソッドを実装し、エラーを確認します。

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

「このメソッドの実装はオプションです。ただし、このメソッドを実装する必要があります。」

于 2012-07-28T04:05:11.107 に答える
0

スイフト3の場合

メソッドは次のように変更されました。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

から:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [AnyObject]!)

[AnyObject] ではなく [CLLocation] への「_」と「locations」のキャストに注意してください!

古いメソッドを使用すると、呼び出されることはなく、変更されたという警告も表示されません。

于 2016-12-29T20:42:44.643 に答える
0

私の場合、didChangeAuthorizationで入りませんでした。実機で試してみました。

電話からアプリケーションを削除し、再度インストールしました。そしてそれはうまくいきます!

これが誰かを助けることを願っています:)

于 2016-10-15T17:48:42.843 に答える