Estou usando o Core Data com Cloud Kit e, portanto, tenho que verificar o status do usuário do iCloud durante a inicialização do aplicativo. Em caso de problemas, desejo emitir um diálogo para o usuário, e faço isso usando UIApplication.shared.keyWindow?.rootViewController?.present(...)
até agora.
No Xcode 11 beta 4, há agora uma nova mensagem de suspensão de uso, informando:
'keyWindow' foi descontinuado no iOS 13.0: não deve ser usado para aplicativos que suportam várias cenas, pois retorna uma janela principal em todas as cenas conectadas
Como devo apresentar o diálogo em vez disso?
SceneDelegate
ouAppDelegate
? E, você poderia postar um pouco mais de código para que possamos duplicar?SceneDelegate
(se estiver usandoSceneDelegate
)Respostas:
Esta é a minha solução:
Uso, por exemplo:
fonte
activationState
valorforegroundInactive
aqui, o que em meu teste será o caso se um alerta for apresentado.foregroundInactive
matt
solução é aquela que funciona.A resposta aceita, embora engenhosa, pode ser excessivamente elaborada. Você pode obter exatamente o mesmo resultado de forma muito mais simples:
Também gostaria de advertir que a depreciação de
keyWindow
não deve ser levada muito a sério. A mensagem de aviso completa é:Portanto, se você não oferece suporte a várias janelas no iPad, não há objeção em prosseguir e continuar usando
keyWindow
.fonte
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "homeVC") as! UITabBarController UIApplication.shared.keyWindow?.rootViewController = vc
porque com o iOS 13 e a visualização do cartão isso se torna um problema porque um usuário após dizer que sair será enviado para a tela de login com o aplicativo principal na hierarquia de visualização, onde pode deslizar para baixo e retornar qual é problemático.keyWindow
propriedade. Daí os votos positivos. Se você não gosta, vote contra ele. Mas não me diga para mudar para corresponder à resposta de outra pessoa; isso, como eu disse, estaria errado.UIApplication.shared.windows.first(where: \.isKeyWindow)
Melhorando ligeiramente a excelente resposta de matt, esta é ainda mais simples, mais curta e mais elegante:
fonte
NSArray
não tem um equivalente afirst(where:)
. Você pode tentar compor um one-liner comfilteredArrayUsingPredicate:
efirstObject:
.first(where:)
:UIApplication.shared.windows.first(where: { $0.isKeyWindow })
UIApplication.shared.windows.first(where: \.isKeyWindow)
Aqui está uma maneira compatível com versões anteriores de detectar
keyWindow
:Uso:
fonte
extension
são bonitos . 🙂windows
eisKeyWindow
existem desde iOS 2.0, efirst(where:)
desde Xcode 9.0 / Swift 4/2017UIApplication.keyWindow
foi descontinuado no iOS 13.0: @available (iOS, introduzido: 2.0, descontinuado: 13.0, mensagem: "Não deve ser usado para aplicativos que suportam várias cenas, pois retorna uma janela principal em todas as cenas conectadas")Normalmente use
Swift 5
Além disso, no UIViewController:
view.window
é a janela atual para cenesWWDC 2019:
fonte
Para uma solução Objective-C
fonte
Idealmente, uma vez que foi preterido, eu aconselharia você a armazenar a janela no SceneDelegate. No entanto, se quiser uma solução temporária, você pode criar um filtro e recuperar a keyWindow assim.
fonte
Uma
UIApplication
extensão:Uso:
fonte
tente com isso:
fonte
fonte
Para uma solução Objective-C também
fonte
fonte
Se você quiser usá-lo em qualquer ViewController, basta usar.
fonte
Inspirado pela resposta de Berni
fonte
Como muitos desenvolvedores que pedem o código Objective C da substituição desta depreciação. Você pode usar o código abaixo para usar o keyWindow.
Criei e adicionei este método na
AppDelegate
classe como um método de classe e utilizo-o de uma forma muito simples que está abaixo.Não se esqueça de adicionar este método na classe AppDelegate.h como abaixo.
fonte
Eu encontrei o mesmo problema. Eu aloquei um
newWindow
para uma visão e configurei-o.[newWindow makeKeyAndVisible];
Quando terminar de usá-lo, configure-o[newWindow resignKeyWindow];
e tente mostrar a janela-chave original diretamente por[UIApplication sharedApplication].keyWindow
.Está tudo bem no iOS 12, mas no iOS 13 a janela-chave original não pode ser exibida normalmente. Mostra toda uma tela branca.
Resolvi este problema:
Espero que ajude.
fonte