Я нашел довольно запутанное решение для этого, и я надеюсь, что есть лучший способ.
Я сделал следующее:
- Подключите действие к существующему Команда «Удалить»
- Создать «ObservableObject»
Menu
, который публикует выбранные команды меню - Передать издателю
ContentView
, чтобы он мог подписаться и действовать в соответствии с изменениями
Вот два соответствующих файла:
Сначала AppDelegate.swift
:
enum MenuCommand {
case none
case delete
}
class Menu: ObservableObject {
@Published var item: MenuCommand = .none
}
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
@ObservedObject var menu = Menu()
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView(menu: menu)
// Create the window and set the content view.
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: contentView)
window.makeKeyAndOrderFront(nil)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
@IBAction func delete(_ sender: Any) {
print("delete menu")
menu.item = .delete
}
}
и ContentView.swift
:
import SwiftUI
struct ContentView: View {
@ObservedObject var menu: Menu
@State var items = ["foo", "bar", "baz"]
@State var selection: String? = nil
var body: some View {
List(selection: $selection) {
ForEach(items, id: \.self) { Text($0) }
}
.onReceive(
self.menu.objectWillChange
.receive(on: RunLoop.main)) { _ in
if
case .delete = self.menu.item,
let sel = self.selection,
let idx = self.items.firstIndex(of: sel) {
print("delete item: \(sel)")
self.items.remove(at: idx)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.animation(.default)
}
}
Примечание: don не забудьте подключить пункт меню «Удалить» к IBAction
.