66

アプリケーションがアクティブまたはフォアグラウンドになったときに UIViewController にデータをリロードしたい。

applicationDidBecomeActive が AppDelegate クラスで呼び出されることを知っています。
しかし、次のコードのように AppDelegate クラスにデータをリロードするには、UIViewController のグローバル変数が必要です。

in AppDelegate.m

// global variable
UIViewController *viewController1;
UIViewController *viewController2;

-(void)applicationDidBecomeActive:(UIApplication *)application
{
    [viewController1 reloadData];
    [viewController2 reloadData];
}

しかし、UIViewController がたくさんある場合は特に不便です。

AppDelegate クラスの代わりに UIViewController で applicationDidBecomeActive を使用できますか?
または、UIViewController のグローバル変数を使用するよりも良い方法はありますか?

また、UIViewControllers から次のメソッドを使用する必要があります。

-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
-(void)applicationWillEnterForeground:(UIApplication *)application
4

6 に答える 6

149

再起動時にView Controllerに特定のものを持たせたい場合は、そのviewDidLoadメソッドに通知を登録する必要があります。

UIApplicationDidBecomeActiveNotification登録されている場合、アプリケーションと指定されたコントローラーに自動的に通知します。

 [[NSNotificationCenter defaultCenter]addObserver:self
                                         selector:@selector(yourMethod)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];
于 2012-08-13T04:36:57.270 に答える
57

Swift で通知ハンドラーを登録する例を次に示します (上記の Apurv の回答から適応)。

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(applicationDidBecomeActive(notification:)),
        name: NSNotification.Name.UIApplicationDidBecomeActive,
        object: nil)
}

@objc func applicationDidBecomeActive(notification: NSNotification) {
    // do something
}

の更新Swift 4.2:

override func viewDidLoad() {
    super.viewDidLoad()

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

@objc func applicationDidBecomeActive(notification: NSNotification) {
    // Application is back in the foreground

    print("active")
}
于 2015-08-12T00:16:30.270 に答える
22

スウィフト 3 :

NotificationCenter.default.addObserver(
    self,
    selector: #selector(applicationDidBecomeActive(_:)),
    name: NSNotification.Name.UIApplicationDidBecomeActive,
    object: nil)



func applicationDidBecomeActive(_ notification: NSNotification) {
    // do something
}

注: オブザーバーを削除することを忘れないでください

于 2016-12-07T17:35:07.617 に答える
2

applicationDidBecomeActiveviewControllerでは使用できません。そのクラスのメソッドではありません。

ただし、applicationDidBecomeActiveAppDelegate のメソッドを使用して、起動時に重要と思われるビュー コントローラーの任意のメソッドを呼び出すことができます。App Delegate がアクセスできるように、コントローラーへのポインターを保持するだけです。

これらのメソッドがView Controllerにどのようなものになるかは、完全にあなたとあなたのプログラムの詳細次第です。たぶん、View Controller でカスタムの update メソッドを呼び出すか、必要に応じて何かを呼び出すことを意味します。

アプリケーションの起動に使用できる多くのシステム通知を使用して、ここで概説されているように NSNotificationCenter を使用することもできます

ただし、私の意見では、NSNotificationCenter に大きく依存することは、アプリを混乱させる良い方法です。AppDelegate のみでメイン メソッドからすべてを呼び出す場合は、いつでもそのメソッドを参照して、起動時にアプリが何を行っているかを正確に知ることができます。代わりに NSNotificationCenter を使用すると、アクションが多くのクラス/オブジェクトに分散する可能性があり、何が起こっているのかを追跡するのが難しくなる可能性があります。applicationDidBecomeActive複数のコントローラーオブジェクトについて言及したので、同じ通知に対して各ビューコントローラーを登録するよりも、すべてを呼び出す方が合理的で整理されていると思います。

于 2012-08-13T04:22:05.267 に答える
-8

私の質問に答えてくれてありがとう。
しかし、UIViewController で applicationDidBecomeActive を使用する簡単な方法を見つけました。

@implementation AppDelegate

-(void)applicationDidBecomeActive:(UIApplication *)application
{
    UIViewController<MyAppDelegate> *topViewController = (UIViewController<MyAppDelegate> *)navigationController.topViewController;
    if ([topViewController respondsToSelector:@selector(MyApplicationDidBecomeActive)]) {
        [topViewController MyApplicationDidBecomeActive];
    }
}
@end

@protocol MyAppDelegate
@optional
-(void)MyApplicationDidBecomeActive;
@end
于 2012-08-19T10:57:02.797 に答える