web-dev-qa-db-ja.com

ビューの背景にアプリが入ったときを検出する最良の方法は何ですか?

NSTimerを使用してコードを実行するView Controllerがあります。

タイマーを一時停止できるように、アプリがバックグラウンドに移行するタイミングを検出する最良の方法は何ですか?

70
jfisk

アプリがバックグラウンドになったときに関心があるクラスであれば、通知を受け取ることができます。これは、これらのクラスをAppDelegateと結合するための優れた代替手段です。

上記のクラスを初期化する場合:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

通知への対応

-(void)appWillResignActive:(NSNotification*)note
{

}
-(void)appWillTerminate:(NSNotification*)note
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:nil];

}
162
Jesse Black

In Swift 4.0

override func viewDidLoad() {
    super.viewDidLoad()

    let app = UIApplication.shared

    //Register for the applicationWillResignActive anywhere in your app.
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.applicationWillResignActive(notification:)), name: NSNotification.Name.UIApplicationWillResignActive, object: app)
}

@objc func applicationWillResignActive(notification: NSNotification) {

}
24
Ashok R

アプリケーションでAppDelegate (void)applicationDidEnterBackground:(UIApplication *)applicationメソッドはiOSによって呼び出されます。そこでタイマーを停止できます。

10
Damien

Swiftでこれを実行しようとしている場合:

initで:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil)

deinitで:

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil)

通知への応答:

dynamic private func applicationWillResignActive() {
    // Do things here
}

Appleは、Swiftで可能な限り動的ディスパッチとObjective-Cセレクターを避けることを推奨していますが、これは依然としてこれを行う最も便利な方法です。

7
Luke

In Swift 4.1:

クロージャーバージョンを使用します。

var observer: NSObjectProtocol!

// inside init or viewDidLoad:
observer = NotificationCenter.default.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: nil) { _ in
    print("willResignActive")
}

deinit {
    NotificationCenter.default.removeObserver(observer)
}

addObserverメソッドは、ある時点で削除する必要がある不透明なオブジェクトを返します。

2
juanjo

スウィフト4:

init() {
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(applicationWillResignActive),
                                           name: NSNotification.Name.UIApplicationWillResignActive,
                                           object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self,
                                              name: NSNotification.Name.UIApplicationWillResignActive,
                                              object: nil)
}

@objc private func applicationWillResignActive() {
    self.header.blur.effect = nil
}
0
thexande

アプリデリゲートの- (void)applicationWillResignActive:(UIApplication *)application。他のオブジェクトのUIApplicationWillResignActiveNotification通知に登録することもできます。

ただし、必ずしもタイマーを一時停止する必要はありません。何もしなければ、アプリはとにかくスリープ状態になり、コードを実行しません。おそらく、アクティブになったときにタイマーが作動します(もしそうなら)。何か特別なことをする必要がある場合は、「アクティブになった」デリゲートメソッドと通知も登録できます。

0
smparkes

注意事項:バックグラウンドで通知されるようにコントローラーAを登録する場合、2番目のコントローラーBを押してBを表示している場合でも呼び出されることに注意してください:この動作が正しくない場合で登録/登録解除することをお勧めします

didAppear/WillDisappear。

0
ingconti