我正在编写一个需要知道当前应用程序的 MenuBarExtra。我有一些代码几乎可以完成这项工作:
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)")
}
}
}
主应用程序设置当前 Bundle ID .onAppear
,然后将其传递给XBContent
视图。我认为这部分工作做得正确,但我愿意接受纠正。
该XBContent
视图仅显示传递的 bundle id 的两个版本:
- 该
init()
方法将值存储在属性中。 - 将其复制
onAppear
到另一个变量中进行测试。在实际生活中,它应该使用该值来读取其他数据。 - 显示
VStack
来自的值init()
和从中复制的值onAppear
。
问题就出在这里:复制的值onAppear
总是慢一步。当应用程序首次启动并打开菜单栏附加功能时,第一个值是正确的,而第二个值是默认的空字符串;下次会修复这个问题。当我切换到另一个应用程序并打开菜单栏附加功能时,第一个值是正确的新 bundle id,而第二个值是旧的,直到我再次尝试才恢复正常。
我从中得知,onAppear
当我认为它应该被触发时,它却没有被触发。
我怎样才能使第二个值正确?
尝试使用 这种方法。请注意,
@Binding var bundleID: String
不需要,视图会为您完成所有工作。在真实设备 macOS 15 上测试。init(...)
XBContent
由于您有
data = bundleID
,这两个值将始终相同。