2013-09-10 8 views
7

iOSがアプリケーションを切り替えるときにviewWillDisappear:viewDidDisappear:が呼び出されるのかどうかは疑問でした(たとえば、ホームボタンがユーザーによって押された)。これにより、画面からビューが消えますが、コールバックが呼び出されますか?アプリケーションを切り替えるときにviewWillDisappear/viewDidDisappearが呼び出されますか?

+7

との結果がどのようなものあなたのテスト? –

+1

私はこれについて疑問に思っている人がいると確信しています。 Googleでは、テストプロジェクトをコーディングするよりもまだ高速です。 – gabor

+0

アプリデリゲートは、アプリの切り替え時にのみ呼び出されます。 –

答えて

11

いいえ、これらのメソッドは呼び出されません。

アプリがバックグラウンドに入ったときに通知を受けるには、UIApplicationWillResignActiveNotification通知に登録できます。

脇に、最も簡単な方法は、簡単なスーパーアプリケーションを作成してブレークポイントを設定することです。

15

できます。

私が前に使用した解決策は、あなたのアプリケーションデリゲートにapplicationDidEnterBackground:applicationWillEnterForeground:を使用することです。

これはアプリのデリゲートで行います。アプリフォアグラウンドに戻ってバックグラウンドに行くとするとき

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [self.window.rootViewController beginAppearanceTransition:NO animated:NO]; 
    [self.window.rootViewController endAppearanceTransition]; 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application { 
    [self.window.rootViewController beginAppearanceTransition:YES animated:NO]; 
    [self.window.rootViewController endAppearanceTransition]; 
} 

今すぐあなたのビューコントローラ階層のあなたのviewWillDisappear:viewDidDisappear:viewWillAppear:viewDidAppear:メソッドが呼び出されます。

これはうまくいきますか?


編集24/11/16(スウィフト3版)

func applicationDidEnterBackground(_ application: UIApplication) { 
    window?.rootViewController?.beginAppearanceTransition(false, animated: false) 
    window?.rootViewController?.endAppearanceTransition() 
} 

func applicationWillEnterForeground(_ application: UIApplication) { 
    window?.rootViewController?.beginAppearanceTransition(true, animated: false) 
    window?.rootViewController?.endAppearanceTransition() 
} 

編集2017年2月1日(すべてのウィンドウ)

func applicationDidEnterBackground(_ application: UIApplication) { 
    for window in application.windows { 
     window.rootViewController?.beginAppearanceTransition(false, animated: false) 
     window.rootViewController?.endAppearanceTransition() 
    } 
} 

func applicationWillEnterForeground(_ application: UIApplication) { 
    for window in application.windows { 
     window.rootViewController?.beginAppearanceTransition(true, animated: false) 
     window.rootViewController?.endAppearanceTransition() 
    } 
} 
+0

驚くほど簡単に見えます。しかし、これを行うための(厄介な)副作用はありますか? –

+0

'viewWillAppear:'や 'viewWillDisappear:'のデストラクタコードに初期化コードを入れるのが狂っていない限り、これは何の問題も起きません。私はこれまで何も経験していません。 – Trenskow

+0

すべてのアプリケーションウィンドウで呼び出しをトリガする方法を示すコードを追加しました。これは、最初の唯一の欠点でなければなりません - それはメインウィンドウでのみ動作します。 – Trenskow

関連する問題