21

ここでトリックが足りない気がします...

applicationDidBecomeActive が呼び出されたときに、現在アクティブなビュー コントローラーで viewDidLoad または viewDidAppear を呼び出したいだけなので、アプリがバックグラウンドから再起動されたときに、アニメーションなどをリセットできます。私の意見の中には気にしないものもありますが、他の人は本当に知る必要があります.

私はストーリーボードを使用しており、私のアプリデリゲートファイルには標準機能がありますが、すべて空のボディがあります。たとえば、didFinishLaunchingWithOptions は YES を返すだけで、他には何もしません。ストーリーボードは、私が推測するすべてを自動的に実行します。

では、どうすれば空白の、情報のないアプリ デリゲートから現在のビュー コントローラーと通信できるでしょうか。

4

6 に答える 6

55

アプリのデリゲートから通知を送信する代わりに、OS は通知を自動的に送信します。これを観察できます。

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(initSongInfo)
                                      name:UIApplicationDidBecomeActiveNotification
                                      object:nil];

そしてもちろん、次のように呼び出して、dealloc メソッドの前または内部で監視を停止してください。

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                      name:UIApplicationDidBecomeActiveNotification 
                                      object:nil];
于 2012-06-12T01:53:45.857 に答える
23

通知を使用することをお勧めします。

アプリのデリゲートの applicationdidBecomeActive メソッドで、次のコードを挿入します。

[[NSNotificationCenter defaultCenter] postNotificationName:@"appDidBecomeActive" object:nil];

現在アクティブなビュー コントローラーの init メソッドで、通知をサブスクライブします。

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

コントローラーに「updateStuff」メソッドを実装すると、アプリがアクティブになったときに何でもできるようになります。

于 2012-04-27T23:53:22.060 に答える
8

迅速なバージョン:

この行をviewDidLoadに追加できます

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplicationDidBecomeActiveNotification, object: nil)

func viewDidBecomeActive(){
    print("viewDidBecomeActive")
}

Swift 5.x バージョン

NotificationCenter.default.addObserver(self, selector: #selector(viewDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)

@objc func viewDidBecomeActive() {
    print("viewDidBecomeActive")
}
于 2016-07-08T13:19:46.787 に答える
2

わかりましたので、それはかなり壊滅的です。

イベントの登録/登録解除に注意する必要があるため、メモリ リークが発生する可能性があります。

すべてを機能させるには、登録ステータスが何であるかを知るフラグを設定する必要があります: バックグラウンドイベントに署名したかどうか。View Controllerがユーザーに表示されたとき(ユーザーが別のユーザーから来た場合)、またはユーザーがホーム画面からView Controllerに来た場合は、イベントに登録する必要があることに注意してください。

ビューコントローラーを別のコントローラーに任せる場合も、登録を解除する必要があります。

要するに:

スウィフト 4:

private var registeredToBackgroundEvents = false

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    registerToBackFromBackground()
}

/// register to back from backround event
private func registerToBackFromBackground() {
    if(!registeredToBackgroundEvents) {
        NotificationCenter.default.addObserver(self, 
        selector: #selector(viewDidBecomeActive), 
        name: UIApplication.didBecomeActiveNotification, object: nil)
        registeredToBackgroundEvents = true
    }
}

/// unregister from back from backround event
private func unregisterFromBackFromBackground() {
    if(registeredToBackgroundEvents) {
        NotificationCenter.default.removeObserver(self, 
        name: UIApplication.didBecomeActiveNotification, object: nil)
        registeredToBackgroundEvents = false
    }

}

@objc func viewDidBecomeActive(){
    logicManager.onBackFromStandby()
}


override func viewWillDisappear(_ animated: Bool) {
    unregisterFromBackFromBackground()
}
于 2019-04-30T00:11:24.503 に答える
0

AppDelegate にはウィンドウ プロパティがあり、そのウィンドウには rootViewController プロパティがあります。ここでviewControllerを見つけることができます。

TabBarController を使用している場合、rootviewcontroller が tabbarcontroller になり、tabbarcontroller の selectedViewController を呼び出して現在の viewController を取得できます。

UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
if ([rootViewController isKindOfClass:[UITabBarController Class]])
    rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
else if ([rootViewController isKindOfClass:[UINavigationController Class]])
    rootViewController = ((UINavigationController *)rootViewController).topViewController;

[rootViewController viewDidAppear];

ナビゲーション コントローラまたはモーダル ビューを含むより複雑なビュー階層がある場合は、presentedViewController または topViewController を呼び出すことができます。

于 2012-04-28T00:04:03.333 に答える
0

どの ViewController が最新かを追跡するのではなく、AppDelegate から NSNotification を送信し、ViewController でそれをサブスクライブすることができます。これにより、View Controller は viewDidAppear を呼び出す必要があるかどうかを追跡します。

于 2012-04-27T23:50:23.647 に答える