SwiftUI中的键盘快捷键

时间:2019-09-14 17:27:09

标签: swift macos swiftui

我正在制作一个SwiftUI应用,我想使用菜单栏添加键盘快捷键。 我已经看过苹果的视频SwiftUI on all devices,但是我不知道他们是如何将menu.xib集成到他们的应用程序中的。

#if targetEnvironment(macCatalyst)
// MacOS
#else
// iOS
#endif

也不起作用。 我试图将菜单栏添加到我的项目中,但是无法编译。您是否知道如何添加一个?

3 个答案:

答案 0 :(得分:0)

  

但是我不知道他们如何将menu.xib集成到他们的应用程序中。

我认为(我没有看过视频)他们确实在Mac上本地实现了SwiftUI,这意味着他们没有使用Catalyst。

我也遇到了完全相同的问题,我通过在AppDelegate中添加一个菜单项来“解决”该问题,然后将通知发送给对该动作感兴趣的视图。这不理想,但是可以。

我使用空格键实现了一个播放动作,它的一部分看起来像这样:
UIKeyCommand(input: " ", modifierFlags: [], action: #selector(togglePlay))

有关更多信息,请参见UIMenuBuilder文档。

答案 1 :(得分:0)

您可以在AppDelegate中覆盖buildMenu函数,然后从那里操纵菜单栏。无需进行Catalyst环境检查即可使用。

override func buildMenu(with builder: UIMenuBuilder) {
    super.buildMenu(with: builder)

    builder.remove(menu: .services)
    builder.remove(menu: .format)
    builder.remove(menu: .toolbar)

    builder.insertChild(newTask(), atStartOfMenu: .file)
    builder.insertSibling(logout(), afterMenu: .about)
    builder.insertSibling(preferences(), afterMenu: .about)     
}

输入键示例:

func newTask() -> UIMenu {

        let command                  = UIKeyCommand(input: "n", modifierFlags: [.command], action: #selector(onNewTask))
        command.title                = "Menu_Title_New_Task".localized()
        command.discoverabilityTitle = command.title

        return UIMenu(title: command.title, image: nil, identifier: "your_identifier_here", options: .displayInline, children: [command])
    }

答案 2 :(得分:0)

在SwiftUI 2.0(在BigSur Beta3上)中,您可以像这样将Menue轻松添加到Mac App:

@main
struct AppWithMenue: App {
  var body: some Scene {
    WindowGroup {
      ContentView()      
    }
    .commands {
      MyCommands()
    }
  }
}

struct MyCommands : Commands{
  var body: some Commands {
    CommandMenu("MyCommands") {
      Section {
        Button("Command 1", action: {print ("Command 1")})
        .keyboardShortcut("1")
        Button("Command 2", action: {print ("Command 2")})
          .keyboardShortcut("2")
      }
    }
  }
}