编辑菜单的撤消/重做显示标题不反映this demo SwiftUI macOS app中的setActionName。撤消/重做功能工作正常,管理器报告它已设置了操作标题。
为什么菜单没有更新?
对于NSApp.menu,autoenablesItems是真的。当循环遍历NSApp中的所有窗口(只有一个窗口)时,UndoManager (仅用于应用程序的一个窗口)与SwiftUI通过环境呈现的实例相同。通过NSApp的引用检查撤消项目标题也会显示项目标题已设置,即使它没有显示在编辑菜单中。
struct ContentView: View {
@Binding var document: DocumentTestDocument
@Environment(\.undoManager) var undo
@StateObject var vm = VM()
@State var autoEnables = false
var body: some View {
VStack(spacing: 25) {
HStack {
Button("<") { vm.performUndo(undo: undo) }
.disabled(!(undo?.canUndo ?? true))
Button("Up") { vm.increment(undo: undo) }
Button("Down") { vm.decrement(undo: undo) }
Button(">") { vm.performRedo(undo: undo) }
.disabled(!(undo?.canRedo ?? true))
}
Text(String(vm.count))
.font(.title)
Text("MenuItemTitle \(vm.title)")
}
.controlSize(.large)
.font(.title3)
.frame(width: 400, height: 300)
.onAppear { DispatchQueue.main.async { autoEnables = NSApp.menu?.autoenablesItems ?? false } }
}
}
class VM: ObservableObject {
@Published var count = 0
@Published var title = ""
func increment(undo: UndoManager?) {
count += 1
undo?.registerUndo(withTarget: self, handler: { (targetSelf) in
targetSelf.decrement(undo: undo)
})
undo?.setActionName("Increment")
title = undo?.undoMenuItemTitle ?? "Nil"
}
func decrement(undo: UndoManager?) {
count -= 1
undo?.registerUndo(withTarget: self, handler: { (targetSelf) in
targetSelf.increment(undo: undo)
})
undo?.setActionName("Increment")
title = undo?.undoMenuItemTitle ?? "Nil"
}
func performUndo(undo: UndoManager?) {
undo?.undo()
}
func performRedo(undo: UndoManager?) {
undo?.redo()
}
}
发布于 2021-07-14 10:10:37
由于某些原因,这并未在新的SwiftUI App
生命周期中实现。如果您在情节提要中设置编辑菜单并自己配置NSHostingView,则撤消菜单项标题将随现有代码正确更改。我当然希望这个功能很快就能实现,因为好名字的undo是我最喜欢的精美Mac应用程序的一部分!
https://stackoverflow.com/questions/66824101
复制相似问题