我正在开发一个
MenuBarExtra
,我需要知道最前面的应用程序的ID。我想我已经成功了,但我不知道当应用程序重新出现时如何更新视图。
这是我所得到的简化版本。
struct Test: View {
var body: some View {
var bundleIdentifier: String = NSWorkspace.shared.frontmostApplication!.bundleIdentifier!
VStack {
Text(bundleIdentifier) // doesn’t change
}
.onAppear(perform: {
bundleIdentifier = NSWorkspace.shared.frontmostApplication!.bundleIdentifier!
print(bundleIdentifier) // correct new value
})
}
}
@main
struct TestApp: App {
var body: some Scene {
MenuBarExtra("Testing", systemImage: "questionmark.bubble") {
Test()
}
.menuBarExtraStyle(.window)
}
}
更新
Text
视图的正确方法是什么?
尝试在视图的
@State private var bundleIdentifier: String ...
之外使用 body
来尝试此方法。
示例代码:
// for testing
class NSWorkspace {
static var shared = NSWorkspace()
var frontmostApplication: BundleIdentifier?
init() {
self.frontmostApplication = BundleIdentifier(bundleIdentifier: "initial value")
}
}
// for testing
struct BundleIdentifier {
var bundleIdentifier: String?
}
struct Test: View {
@State private var bundleIdentifier: String = NSWorkspace.shared.frontmostApplication!.bundleIdentifier! // <--- here
var body: some View {
VStack {
Text(bundleIdentifier)
Button("Change") {
bundleIdentifier = UUID().uuidString // <--- here some random text
}
}
.onAppear(perform: {
bundleIdentifier = NSWorkspace.shared.frontmostApplication!.bundleIdentifier!
print(bundleIdentifier)
})
}
}