SwiftUI Кнопка для выбора действия - PullRequest
0 голосов
/ 03 июля 2019

Мне нужно, чтобы кнопка 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 голосов
/ 08 июля 2019

Если вы хотите отправить действие по цепочке респондента, вы можете использовать метод -[NSApplication sendAction:to:from:], передавая для цели nil.

Это можно сделать, есливы хотите работать с цепочкой респондента AppKit, которая может включать ваш SwiftUI NSHostingView вместе с остальной цепочкой респондента (его суперпредставления, окно и т. д.).Теоретически, если вы хотите обработать действие на основе селектора из содержимого SwiftUI, вы можете использовать модификатор onCommand для распознавания Command обертывания этого селектора.Однако ваш NSHostingView должен быть в цепочке респондента AppKit, а представление onCommand SwiftUI должно быть сфокусировано (или предком сфокусированного представления) для распознавания команды.Основным преимуществом этого является то, что вы также можете обрабатывать действия меню, используя точно такой же код, поскольку действия меню обычно отправляются через цепочку респондента.

Если вы пытаетесь изменить состояние, связанное с некоторым другим представлением SwiftUI,может быть проще передать Binding или параметр замыкания в структуру представления в качестве аргумента его инициализатору.Например, вы можете сохранить какое-то состояние где-то еще (например, «набор выбранных объектов»), а затем передать закрытие кнопке, которая изменяет состояние («поместить каждый объект в набор выбранных объектов») без необходимости непосредственного обучениякнопка об этом состоянии.

...