SwiftUI Button to Selector操作

时间:2019-07-03 17:14:19

标签: appkit 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具有Command结构,可以包装Selector,但是尚不清楚在创建命令后如何实际调用选择器。

建议在按下按钮时发出任意Command的方法是什么?

1 个答案:

答案 0 :(得分:0)

如果要沿响应者链调度操作,则可以使用-[NSApplication sendAction:to:from:]方法,将public function getList($name) { $category_id = Category::where('name', '=', $name)->first()->id; $posts = Post::whereHas('category', function ($q) use ($category_id) { $q->where('id', '=', $category_id); })->paginate(12); return view('blog.index')->withPosts($posts)->withName($name); } 传递给目标。

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

如果您要修改与其他某些SwiftUI视图相关的状态,将onCommand或闭包参数传​​递给视图结构作为其初始化程序的参数可能更直接。例如,您可以在其他地方保持某种状态(即“所选对象集合”),然后将闭包传递给修改状态的按钮(“将所选对象集合中的每个对象放入”),而不必直接讲授关于该状态的按钮。