Подтвердить что ты не робот

Какой лучший способ определить, когда приложение вводит фон для моего представления?

У меня есть контроллер вида, который использует NSTimer для выполнения некоторого кода.

Какой лучший способ определить, когда приложение перейдет на задний план, чтобы я мог приостановить таймер?

4b9b3361

Ответ 1

Вы можете заинтересовать любого класса, когда приложение переходит в фоновое уведомление. Это хорошая альтернатива сочетанию этих классов с 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];

}

Ответ 2

В ваших приложениях AppDelegate метод (void)applicationDidEnterBackground:(UIApplication *)application будет вызываться iOS. Вы можете остановить свой таймер там.

Ответ 3

В Swift 3.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)
}

func applicationWillResignActive(notification: NSNotification) {

}

Ответ 4

Для тех, кто хочет сделать это в 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 поощряет нас избегать динамических диспетчеров и селекторов Objective-C, когда это возможно, в Swift, но это все еще самый удобный способ сделать это.

Ответ 5

- (void)applicationWillResignActive:(UIApplication *)application в вашем делете приложения. Вы также можете зарегистрироваться для уведомления UIApplicationWillResignActiveNotification для других объектов.

Однако вам необязательно приостанавливать таймер. Если вы ничего не сделаете, приложение все равно будет спать и не будет выполнять какой-либо код. Предположительно, ваш таймер загорится, когда вы снова активируете (если вы это сделаете). Если вам нужно сделать что-то особенное, есть методы "стать активными" делегатами и уведомления, которые вы также можете зарегистрировать.

Ответ 6

попробуйте это для SWIFT 3: В случае события didReceiveRemoteNotification в файле AppDelegate.

       if application.applicationState == UIApplicationState.active {
            // TODO ACTIVE APP
            // Post notification
            NotificationCenter.default.post(name: Notification.Name("MY_NAME_NOTIFICATION"), object: nil, userInfo: userInfo)
        } else if application.applicationState == UIApplicationState.inactive {
            // TODO INACTIVE APP
        } else if application.applicationState == UIApplicationState.background {
            // TODO BACKGROUND APP
        }

И добавьте OBSERVER в FirstViewController

  override func viewDidLoad() {
            super.viewDidLoad()

            let nc = NotificationCenter.default // Note that default is now a property, not a method call
            nc.addObserver(self, selector: #selector(self.CallNotificationObserver), name:Notification.Name("MY_NAME_NOTIFICATION"), object: nil)
   }