首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >菜单中未显示UndoManager.setActionName (SwiftUI macOS)

菜单中未显示UndoManager.setActionName (SwiftUI macOS)
EN

Stack Overflow用户
提问于 2021-03-27 04:46:15
回答 1查看 116关注 0票数 2

编辑菜单的撤消/重做显示标题不反映this demo SwiftUI macOS app中的setActionName。撤消/重做功能工作正常,管理器报告它已设置了操作标题。

为什么菜单没有更新?

对于NSApp.menu,autoenablesItems是真的。当循环遍历NSApp中的所有窗口(只有一个窗口)时,UndoManager (仅用于应用程序的一个窗口)与SwiftUI通过环境呈现的实例相同。通过NSApp的引用检查撤消项目标题也会显示项目标题已设置,即使它没有显示在编辑菜单中。

代码语言:javascript
运行
复制
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()
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-07-14 10:10:37

由于某些原因,这并未在新的SwiftUI App生命周期中实现。如果您在情节提要中设置编辑菜单并自己配置NSHostingView,则撤消菜单项标题将随现有代码正确更改。我当然希望这个功能很快就能实现,因为好名字的undo是我最喜欢的精美Mac应用程序的一部分!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66824101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档