Estou escrevendo um MenuBarExtra que precisa saber o aplicativo atual. Tenho um código que quase faz o trabalho:
import SwiftUI
@main
struct XBApp: App {
@State var bundleID: String = ""
var body: some Scene {
MenuBarExtra("Something", systemImage: "questionmark.bubble") {
VStack {
XBContent(bundleID: bundleID)
.padding(0)
}
.onAppear {
bundleID = NSWorkspace.shared.frontmostApplication!.bundleIdentifier!
print("\(#fileID):\(#line) - \(bundleID)")
}
}
.menuBarExtraStyle(.window)
}
}
struct XBContent: View {
var bundleID: String = ""
@State var data: String = ""
init(bundleID: String) {
self.bundleID = bundleID // store received value
}
var body: some View {
VStack {
Text(bundleID) // current value
Text(data) // previous value
}
.onAppear {
data = bundleID // copy value
print("\(#fileID):\(#line) - \(bundleID) | \(data)")
}
}
}
O aplicativo principal define o Bundle id atual .onAppear
e isso é então passado para a XBContent
visualização. Acho que essa parte está fazendo seu trabalho corretamente, mas estou aberto a correções.
A XBContent
visualização simplesmente exibe duas versões do ID do pacote passado:
- o
init()
método armazena o valor em uma propriedade. - copia
onAppear
-o para outra variável para teste. Na vida real, ele supostamente usa esse valor para ler outros dados. - exibe
VStack
o valor deinit()
e o valor copiado deonAppear
.
Aqui está o problema: o valor copiado de onAppear
está sempre um passo atrás do outro. Quando o aplicativo é iniciado pela primeira vez e o extra da barra de menu é aberto, o primeiro valor está correto, enquanto o segundo é a string vazia padrão; isso é corrigido na próxima vez. Quando eu troco para outro aplicativo e abro o extra da barra de menu, o primeiro valor é o novo id do pacote correto, enquanto o segundo é o antigo, até que eu tente novamente e esteja OK.
Concluo que isso onAppear
não é acionado quando eu pensava que deveria.
Como posso fazer com que o segundo valor seja o correto?
Experimente esta abordagem usando
@Binding var bundleID: String
. Note que não há necessidade deinit(...)
inXBContent
, a view faz tudo para você. Testado em dispositivo real macOS 15.Como você tem
data = bundleID
, esses dois valores serão sempre os mesmos.