SwiftUI 按钮到选择器操作

mar*_*rux 5 appkit swiftui

我需要一个 SwiftUI 按钮在当前聚焦的组件上执行 Objective-C 选择器。以下作品:

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

\xe2\x80\xa6但这显然真的很难看。SwiftUI 有一个Command可以包装 a 的结构Selector,但尚不清楚创建命令后如何实际调用选择器。

\n\n

Command按下按钮时发出任意指令的推荐方法是什么?

\n

Jef*_*eff 1

如果你想沿着响应者链调度一个动作,你可以使用该-[NSApplication sendAction:to:from:]方法,传递nil目标。

如果您想使用 AppKit 响应程序链,您可以这样做,其中可能包括您的 SwiftUINSHostingView以及响应程序链的其余部分(其超级视图和窗口等)。理论上,如果您想处理 SwiftUI 内容中基于选择器的操作,您可以使用修饰符onCommand来识别Command对该选择器的包装。但是,您NSHostingView需要位于 AppKit 响应程序链中,并且onCommand需要聚焦 SwiftUI 视图(或聚焦视图的祖先)才能识别命令。这样做的主要好处是,您还可以使用完全相同的代码处理菜单栏操作,因为菜单栏操作通常通过响应程序链进行调度。

如果您尝试修改与其他某些 SwiftUI 视图相关的状态,则将一个Binding或一个闭包参数传​​递给您的视图结构作为其初始值设定项的参数可能会更直接。例如,您可以在其他地方维护某些状态(即“选定对象的集合”),然后将闭包传递给修改状态的按钮(“将每个对象放入选定对象的集合中”),而无需直接教导关于该状态的按钮。