2012-01-25 5 views

Odpowiedz

146

Możesz mieć dowolną klasę, gdy aplikacja przechodzi w tło, otrzymuj powiadomienia. Jest to dobra alternatywa do łączenia tych klas z AppDelegate.

Podczas inicjowania powiedział klas:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil]; 

Odpowiadając powiadomień

-(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

Musiałem zrobić małą poprawkę do działania tego kodu: dodając dwukropek do nazw metod w '@ selector', tj. Zamieniając' @selector (appWillResignActive) 'z' @selector (appWillResignActive:) 'i tym samym dla '@selector (appWillTerminate:)'). – Piovezan

+0

@Piovezan, powodem, dla którego potrzebujesz ":", jest to, że niezależnie od tego, jak nazywasz swoją metodę, nadal musi przyjmować "..jeden tylko jeden argument (instancję NSNotification)." - Wystarczy Alt + kliknięcie lewym przyciskiem myszy na deklarację addObserver, aby dowiedzieć się więcej. –

+0

Świetna odpowiedź! Dziękuję za uratowanie mnie ciągnącego włosy !! – Septronic

0

- (void)applicationWillResignActive:(UIApplication *)application na delegacie aplikacji. Możesz także zarejestrować się w powiadomieniu UIApplicationWillResignActiveNotification na innych obiektach.

Nie musisz jednak wstrzymywać stopera. Jeśli nic nie zrobisz, aplikacja i tak zostanie uśpiona i nie wykona żadnego kodu. Prawdopodobnie czasomierz wystrzeli po ponownym aktywowaniu (jeśli to zrobisz). Jeśli chcesz zrobić coś specjalnego, istnieją "delegowane metody" i powiadomienia, na które możesz się również zarejestrować.

+0

Jak wspomniano, nie jest „czerwony” wersja, która jest całkiem podobny do dymisji, jeśli jesteś aktywny tylko kierowanie 4.0 lub nowszy. "Aktywne" wersje wracają do wersji 2.0. – smparkes

+0

+1, nie wiedziałem, że masz powiadomienie, gdy podaję odpowiedź –

+1

Ściśle mówiąc, aplikacja, która rezygnuje z aktywnego stanu, może nie zakończyć się stanem tła (np. W przypadku tymczasowej przerwy, takiej jak połączenie telefoniczne lub SMS). – Marco

8

W aplikacjach AppDelegate metoda (void)applicationDidEnterBackground:(UIApplication *)application zostanie wywołana przez iOS. Możesz tam zatrzymać stoper.

+1

Twoja aplikacja może się również zarejestrować w powiadomieniach o powiadomieniach UIApplicationDidEnterBackgroundNotification. – Marco

3

Dla tych, którzy chcą to zrobić w Swift:

Na init:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil) 

Na deinit:

NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil) 

Reagowanie na zgłoszenia:

dynamic private func applicationWillResignActive() { 
    // Do things here 
} 

Jabłko zachęca nas, aby uniknąć dynamiczne wysyłki i Objective-C selektorów w miarę możliwości w Swift, ale jest to nadal najbardziej wygodny sposób zrobić to.

10

w Swift 4.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) 
} 

@objc func applicationWillResignActive(notification: NSNotification) { 

} 
+1

dzięki za edycję @bart van kuik –

0

spróbować to dla SWIFT 3: Na didReceiveRemoteNotification zdarzeń w AppDelegate pliku.

 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 
     } 

I dodać obserwator w 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) 
    }