2011-12-29 8 views

答えて

2

あなたが間違ったアプローチをしているようです。ロケーションマネージャはビューコントローラ上のインスタンス変数であるため、ビューコントローラは、アプリケーションデリゲートではなく、停止するように指示する必要があります。

これは、Cocoa/UIKit/Objective-Cが動作するように設計された方法で、他のものは上り坂です。

おそらく

あなたのViewControllerでこのような何か:

@implementation MyViewController 

- (id)init 
{ 
    ... 

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

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

    ... 
} 

- (void)dealloc 
{ 
    [self.locationManager stopUpdatingLocation]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    ... 
} 

- (void)applicationWillEnterForeground:(NSNotification *)notif 
{ 
    [self.locationManager startUpdatingLocation]; 
} 


- (void)applicationDidEnterBackground:(NSNotification *)notif 
{ 
    [self.locationManager stopUpdatingLocation]; 
} 

@end 

しかし、あなたのビューコントローラ内からアプリデリゲートにアクセスするためにこれを使用することができ、あなたの特定の質問に答えるために:

意志
[UIApplication sharedApplication].delegate 

View Controllerについて説明しましょう。しかし、これを行うメモリリークを作成する可能性があるので注意してください!

デリゲートがビューコントローラを保持していないことを確認する必要があります。そうしないと、割り当てが解除されません。また、ビューコントローラの割り当てを解除するときに、ビューコントローラへのデリゲートの参照がnilに設定されていることを確認する必要があります。

一般に、特定のビューコントローラについて、アプリケーションデリゲートが何も知らないようにする必要があります。

+0

あなたの助けに感謝しますが、私の質問は逆です。私はappdeidenterbackgroundメソッドが呼び出されたときに私のviewcontrolerにメッセージを送ることができるようにappdelegateの中で私のviewControllerを参照する方法が必要です。あなたが投稿したコードはうまくいくと思うが、appcontrollerのメッセージがappdelegateに送られたことをviewcontrollerに伝えるappdelegateからviewcontrollerにメッセージを送る方が簡単だろう。ありがとうございました – Mppl

+0

あなたのビューコントローラは、コントローラに関する情報を伝えるためにアプリケーションデリゲートにメッセージを送信する必要があります。例: '[UIApplication sharedApplication] .delegate.myViewController = self;'そうしなければ、メモリリークやクラッシュにつながるでしょう。あなたの質問でなぜ説明するか)。 –

+0

理由はシンプルです。私のviewcontrollerにCLLocationManagerのインスタンスがあり、ビューのロード時にstartupdatinglocationが必要なので、いくつかの時間に停止するように指示する必要があります。他のデリゲートメソッドviewcontrollerにはviewdidunloadがありますが、私はappULLterminateメソッド(私のappdelegateで実装されている)内のCLLocationmanagerインスタンスを何とか参照して、stopUpdatingLocationに伝える必要があるので、アプリケーションがバックグラウンドに入ると位置の更新を停止したくありません。 – Mppl

0

アプリケーションがバックグラウンドを入力しようとしているときに、viewWillDisappearデリゲートメソッドがviewcontrollerで呼び出されていませんか?

+0

いいえ...私はそこに持っていたいと思っています...役に立つでしょう – Mppl

関連する問題