3

初めての iOS アプリの開発に問題があるため、ここでの最初の質問です。何千もの懐中電灯アプリの 1 つですが、できるだけ多くの機能を追加しようとしています。そのうちの 1 つは、アプリがバックグラウンドまたは終了したときにアプリの状態を保存することです。フォアグラウンド (iOS 4 以降) または再起動した後、ファイルから設定を読み込んで再適用しています。設定の 1 つは、明らかにAVCaptureDevice.torchMode. ただし、これで問題が発生します。メソッドでこれらの設定を再適用していますapplicationDidBecomeActive。それはすべてうまくいくようですが、ホームボタンをすばやくタップしてからアプリを再起動すると、アプリは次のことを行います (私はapplicationDidBecomeActiveそれを観察する方法を遅らせました):

1. 黒い画面を表示します (読み込み中)
2. 実行しますapplicationDidBecomeActiveLED をオンにします (ここに遅延を入れます)
3. 電流UIViewControllerを表示し、同時に LED をオフにします

アプリが送信された直後にバックグラウンドからアプリを呼び出した後にのみ発生します。これが現実的なユースケースのシナリオではないことはわかっていますが、バグはしばしば「スタック」し、この (おそらく) 悪い設計が原因で、将来他の問題に遭遇する可能性があると考えるのが好きです。コードがプロパティNSLogを変更するたびに、これが LED をオフにするコードではないことは間違いありません。AVCaptureDevice.torchMode正確に言えば、私の質問は次のとおりです。おそらく に関連して、トーチをオフにする可能性のある の
後に呼び出されるメソッドは何ですか? また、それに対する解決策または回避策はありますか?applicationDidBecomeActiveUIViewController

4

2 に答える 2

5

iOS アプリ プログラミング ガイドによると:

フォアグラウンドに戻ることは、アプリがバックグラウンドに移動したときに停止したタスクを再開するチャンスです。フォアグラウンドに移動するときに発生する手順を図 3-6 に示します。applicationWillEnterForeground: メソッドは、applicationDidEnterBackground: メソッドで行われたすべての操作を元に戻す必要があり、applicationDidBecomeActive: メソッドは、起動時と同じアクティベーション タスクを引き続き実行する必要があります

applicationDidBecomeActive:の代わりにメソッドで設定を再適用しようとしましたapplicationWillEnterForeground:か?

考慮すべきもう 1 つのことは、通知の操作です。

AppDelegateのapplicationDidBecomeActive:またはapplicationDidBecomeActive:メソッドで、アプリ デリゲートに通知をコントローラーにディスパッチするように指示できます。

- (void)applicationDidBecomeActive:(UIApplication *)application {
    /*
     Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
     */

    // Dispatch notification to controllers
    [[NSNotificationCenter defaultCenter] postNotificationName: @"didBecomeActive" 
                                                        object: nil 
                                                      userInfo: nil];
}

これを取得すると、View Controller は次のように (たとえば、init メソッドで) これらの通知を登録できます。

[[NSNotificationCenter defaultCenter] addObserver: self 
                                                 selector: @selector(loadSettings) 
                                                     name: @"didBecomeActive" 
                                                   object: nil];

このようにして、コントローラーはアプリがアクティブになったことを認識し、必要なメソッドを実行できます。

この例では、View Controller が通知 (アプリのデリゲートによって投稿されたもの) をloadSettings受信したときにメソッドを実行するように指示しています。didBecomeActive

于 2011-12-05T15:56:06.670 に答える
3

アプリのクイックストップスタートが黒い画面を表示する理由についての答えしかありません。個人的な経験と観察だけでは参考になりません。

アプリがバックグラウンドに送られると、OS はDefault.png. スクリーンショットが撮影される前にアプリを起動Default.pngし、プロジェクトに がない場合は、それが取得されます。

あなたの実際の質問についてまだ考えています。

于 2011-12-05T20:57:18.450 に答える