0

アプリのデリゲートで取得したユーザーの位置を取得するために、アプリの他の場所からメソッドを呼び出したいと考えています。CLLocation *getCurLoc = [AppDelegate getCurrentLocation];別のView Controllerから呼び出すと、何も返されません。

アプリデリゲートは、

@synthesize locationManager;

CLLocation *location;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy=kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];

    return YES;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

    [locations lastObject];
    [manager stopUpdatingLocation];

    CLLocation *location =  [locations lastObject];
}

+(CLLocation *)getCurrentLocation{
    return location;
}

「-」を使用してインスタンスメソッドに変更しても機能しませんでした。「場所」をインスタンス化する必要がありますか?デリゲートをインスタンスにする必要がありますか、それとも他の場所からアクセスするためのより良い方法はありますか?

4

3 に答える 3

2

では、ファイルの先頭で定義されたグローバル変数ではなく、ローカル変数didUpdateLocationsを定義して設定します。ラインの変更locationlocation

CLLocation *location =  [locations lastObject];

location =  [locations lastObject];

問題を解決します。しかし、より適切な解決策は、AppDelegate クラスのプロパティを使用することです。クラス拡張で定義できます。

@interface AppDelegate ()
@property(strong, nonatomic) CLLocation *location;
@end

次に、次のようなインスタンスメソッドでアクセスします

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

    [locations lastObject];
    [manager stopUpdatingLocation];
    self.location =  [locations lastObject];
}

そして、次のようなクラスメソッドで

+(CLLocation *)getCurrentLocation{
    // Get the instance:
    AppDelegate *app = [[UIApplication sharedApplication] delegate];

    return app.location;
}

更新: AppDelegate が一部のプロトコル (パブリック インターフェイスまたはクラス拡張) に準拠するように宣言されている場合、たとえば、次のようになります。

@interface AppDelegate () <CLLocationManagerDelegate>
@property(strong, nonatomic) CLLocation *location;
@end

次に、上記のコードは警告を作成します

initializing 'AppDelegate *__strong' with an expression of incompatible type 'id<UIApplicationDelegate>'

明示的なキャストが必要です。

+(CLLocation *)getCurrentLocation{
    // Get the instance:
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    return app.location;
}
于 2013-11-02T19:56:10.580 に答える
0

AppDelegate以下を使用して、アプリケーションの任意の場所から にアクセス[UIApplication sharedApplication].delegateできます。

CLLocation *location = [(YourAppDelegateClassName*)[UIApplication sharedApplication].delegate getCurrentLocation];

メソッドgetCurrentLocationはインスタンス メソッド ( ) である必要があります-(CLLocation *)getCurrentLocation#import "YourAppDelegateClassName.h"その方法を使用するために必要なファイルもインポートする必要があります。

毎回のキャストとアクセスを避けるため[UIApplication sharedApplication].delegateに、AppDelegate に静的メソッドを実装することを好みます。

+ (YourAppDelegateClassName*)sharedDelegate {
    return (YourAppDelegateClassName*)[UIApplication sharedApplication].delegate;
}

したがって、次のような方法を使用できます。

CLLocation *location = [[YourAppDelegateClassName sharedDelegate] getCurrentLocation];
于 2013-11-02T19:54:31.063 に答える