更新 SwiftUI 中的视图元素

问题描述 投票:0回答:1

我正在开发一个

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
视图的正确方法是什么?

swift macos swiftui
1个回答
0
投票

尝试在视图的

@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)
        })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.