ti-enxame.com

Manipulando applicationDidBecomeActive - "Como um controlador de exibição pode responder ao aplicativo se tornando ativo?"

Eu tenho o protocolo UIApplicationDelegate na minha classe principal AppDelegate.m, com o método applicationDidBecomeActive definido.

Eu quero chamar um método quando o aplicativo retorna do plano de fundo, mas o método está em outro controlador de modo de exibição. Como posso verificar qual view controller está exibindo no método applicationDidBecomeActive e, em seguida, fazer uma chamada para um método dentro desse controlador?

165
Calvin

Qualquer classe em seu aplicativo pode se tornar um "observador" para diferentes notificações no aplicativo. Quando você cria (ou carrega) seu controlador de visualização, você deseja registrá-lo como um observador para o UIApplicationDidBecomeActiveNotification e especificar qual método você deseja chamar quando essa notificação for enviada para seu aplicativo.

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

Não se esqueça de limpar depois de si mesmo! Lembre-se de se remover como observador quando sua visão estiver desaparecendo:

[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:UIApplicationDidBecomeActiveNotification
                                              object:nil];

Mais informações sobre o Notification Center .

292
Reed Olsen

Swift 3, 4 Equivalente:

adicionando observador

NotificationCenter.default.addObserver(self,
    selector: #selector(applicationDidBecomeActive),
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for Swift 4.2+
    object: nil)

removendo o observador

NotificationCenter.default.removeObserver(self,
    name: .UIApplicationDidBecomeActive, // UIApplication.didBecomeActiveNotification for Swift 4.2+
    object: nil)

callback

@objc func applicationDidBecomeActive() {
    // handle event
}
54
igrek

Swift 2 Equivalent:

let notificationCenter = NSNotificationCenter.defaultCenter()

// Add observer:
notificationCenter.addObserver(self,
  selector:Selector("applicationWillResignActiveNotification"),
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove observer:
notificationCenter.removeObserver(self,
  name:UIApplicationWillResignActiveNotification,
  object:nil)

// Remove all observer for all notifications:
notificationCenter.removeObserver(self)

// Callback:
func applicationWillResignActiveNotification() {
  // Handle application will resign notification event.
}
16
Zorayr

Swift 4,2

Adicionar observador

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

Remover observador

NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)

Handle Event-

@objc func handleEvent() {
}
5
Abhishek Jain

Com Swift 4, Apple avisa através de um novo aviso de compilador que evitamos o uso de #selector neste cenário. O seguinte é uma maneira muito mais segura de realizar isso:

Primeiro, crie um var preguiçoso que possa ser usado pela notificação:

lazy var didBecomeActive: (Notification) -> Void = { [weak self] _ in
    // Do stuff
} 

Se você precisar incluir a notificação real, basta substituir _ por notification.

Em seguida, configuramos a notificação para observar a ativação do aplicativo.

func setupObserver() {
    _ = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive,
                                               object: nil,
                                               queue:.main,
                                               using: didBecomeActive)
}

A grande mudança aqui é que, em vez de chamar um #selector, agora chamamos o var criado acima. Isso pode eliminar situações em que você recebe falhas inválidas no seletor.

Finalmente, nós removemos o observador.

func removeObserver() {
    NotificationCenter.default.removeObserver(self, name: .UIApplicationDidBecomeActive, object: nil)
}
3
CodeBender