SwiftUi按钮进行选择器操作



我需要让SwiftUI按钮在当前集中的组件上执行Objective-C选择器。以下工作:

let button = Button(action: {
  let command = #selector(NSStandardKeyBindingResponding.selectAll(_:))
   NSApplication.shared.currentEvent?.window?.firstResponder?.doCommand(by: command)
}, label: { Text("Select All") })

…但这显然很丑陋。SwiftUi具有可以包装SelectorCommand结构,但是一旦创建命令,就不清楚如何实际调用选择器。

按下按钮时,建议发布任意Command的推荐方法是什么?

如果要沿响应链派遣动作,则可以使用-[NSApplication sendAction:to:from:]方法,通过nil进行目标。

如果您想与AppKit响应器链一起使用,则可能会使用SwiftUi NSHostingView以及其余的响应者链(其Supperiews和Windows等(。从理论上讲,如果您想从SwiftUI内容中处理基于选择器的操作,则可以使用onCommand修饰符识别Command包装该选择器。但是,您的NSHostingView需要在AppKit响应器链中,并且需要将onCommand SwiftUI视图集中在命令中(或集中视图的祖先(。对此的主要好处是,您还可以使用完全相同的代码来处理Menubar的动作,因为Menubar的动作通常通过响应者链来派遣。

如果您试图修改与其他SwiftUI视图相关的状态,则将Binding或闭合参数传递给视图struct可能更为直接,作为参数,将其作为参数。例如,您可以在其他地方维护某些状态(即"选定对象的集合"(,然后将闭合传递给修改状态的按钮("将每个对象都放在选定对象中"(而无需直接教导关于该状态的按钮。

最新更新