我有一個非常簡單的示例 macOS 應用程式,它帶有一個自定義選單命令,只是為了測驗我的想法,如下所示。
import SwiftUI
@main
struct MenuMonsterMacApp: App {
@State var fileOpenEnabled: Bool = true
var body: some Scene {
WindowGroup {
ContentView()
.frame(width: 480.0, height: 320.0)
}.commands {
CommandGroup(after: .newItem) {
Button {
print("Open file, will you?")
} label: {
Text("Open...")
}
.keyboardShortcut("O")
.disabled(false)
}
}
}
}
我想通過單擊放置在ContentView. 所以我創建了一個ObservableObject類來觀察 File Open 命令的布林值,如下所示。
import SwiftUI
@main
struct MenuMonsterMacApp: App {
@ObservedObject var menuObservable = MenuObservable()
@State var fileOpenEnabled: Bool = true
var body: some Scene {
WindowGroup {
ContentView()
.frame(width: 480.0, height: 320.0)
}.commands {
CommandGroup(after: .newItem) {
Button {
print("Open file, will you?")
} label: {
Text("Open...")
}
.keyboardShortcut("O")
.disabled(!fileOpenEnabled)
}
}.onChange(of: menuObservable.fileOpen) { newValue in
fileOpenEnabled = newValue
}
}
}
class MenuObservable: ObservableObject {
@Published var fileOpen: Bool = true
}
在我的ContentView虛擬運行節目中,我有以下內容。
import SwiftUI
struct ContentView: View {
@StateObject var menuObservable = MenuObservable()
var body: some View {
VStack {
Button {
menuObservable.fileOpen.toggle()
} label: {
Text("Click to disable 'File Open'")
}
}
}
}
如果我單擊該按鈕,相關選單命令的布爾狀態將不會改變。這是一個錯誤的方法嗎?如果是,如何啟用和禁用選單命令ContentView?謝謝。
uj5u.com熱心網友回復:
要通過單擊放置在 中的按鈕來啟用和禁用命令,請ContentView嘗試以下方法,使用傳遞environmentObject和選單按鈕的單獨視圖。
import SwiftUI
@main
struct MenuMonsterMacApp: App {
@StateObject var menuObservable = MenuObservable()
var body: some Scene {
WindowGroup {
ContentView().environmentObject(menuObservable)
.frame(width: 480.0, height: 320.0)
}.commands {
CommandGroup(after: .newItem) {
OpenCommand().environmentObject(menuObservable)
}
}
}
}
struct OpenCommand: View {
@EnvironmentObject var menuObservable: MenuObservable
var body: some View {
Button {
print("Open file, will you?")
} label: {
Text("Open...")
}
.disabled(!menuObservable.fileOpen)
.keyboardShortcut("O")
}
}
class MenuObservable: ObservableObject {
@Published var fileOpen: Bool = true
}
struct ContentView: View {
@EnvironmentObject var menuObservable: MenuObservable
var body: some View {
VStack {
Button {
menuObservable.fileOpen.toggle()
} label: {
Text("Click to disable 'File Open'")
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/408691.html
標籤:
