Estou escrevendo um aplicativo SwifttUI multiplataforma e quero fazer com que a versão Mac defina o campo em foco atual para um campo específico quando o usuário trocar para outro aplicativo e depois voltar para o meu aplicativo. (Para completar, farei a mesma coisa no iOS.)
Para fazer isso, tentei adicionar este código ao init da minha view:
let didBecomeKeyNotification: NSNotification.Name = {
#if os(macOS)
return NSWindow.didBecomeKeyNotification
#else
return UIApplication.didBecomeKeyNotification
#endif
}()
NotificationCenter.default.addObserver(
forName: didBecomeKeyNotification,
object: nil,
queue: nil) { _ in
self.pointToFirstInputField()
}
Where pointToFirstInputField()
define o valor de focusedField
(uma @FocusState
var) para o campo de texto que desejo selecionar quando a janela se tornar a janela principal novamente.
No entanto, isso me dá um erro que Escaping closure captures mutating 'self' parameter
.
Ok, tentei adicionar uma [weak self]
lista de captura ao meu encerramento. Isso me dá um erro de que "'fraco' só pode ser aplicado a tipos de protocolo de classe e vinculados a classe, não a 'WordleView'"
O que faz sentido, já que uma visualização do SwiftUI é uma estrutura - um tipo de valor.
Então, qual é a solução aqui?
Editar:
(Observe que a pergunta "duplicada" vinculada não é duplicada. Não estou usando a versão de notificações que usa um alvo/ação. Estou usando a versão mais recente que fecha. Minha pergunta é sobre como chamar uma função mutante do corpo do meu fechamento.)
Também não me permite usar um grupo de captura para trabalhar com uma variável fraca.
Fiz funcionar usando o valor do ambiente
controlActiveState
em vez de notificações. Em meus testes, isso funcionou tanto ao ativar o aplicativo quanto internamente entre duas janelas ao alternar entre elas.Aqui está uma implementação simples