SwiftUI iOS - 如何捕获硬件按键事件

2023-11-26

我是 iOS 开发新手。按照教程,我使用 SwiftUI 创建了一个简单的计算器。

我的 iPad 连接了键盘,我希望能够使用键盘输入值。

如何在 SwiftUI 应用程序(没有文本字段)中捕获和处理硬件键盘事件? 我尝试在 SceneDelegate (UIResponder) 上使用 keyCommands,如下所示,但这对我不起作用。一旦我按下 iPad 上的任意键,我就会在 XCode 跟踪视图中看到“与守护进程的连接已失效”。

 class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    override var canBecomeFirstResponder: Bool {
        return true;
    }
    override var keyCommands: [UIKeyCommand]? {
        return [
            UIKeyCommand(input: "a", modifierFlags: [], action: #selector(test)),
            UIKeyCommand(input: UIKeyCommand.inputLeftArrow, modifierFlags: [], action: #selector(test))
        ]
    }

    @objc func test(_ sender: UIKeyCommand) {
        print("test was pressed")
    }

Thanks


它需要重写托管视图控制器,并且一切正常。使用 Xcode 11.2 / iOS 13.2 进行测试

这是示例代码

class KeyTestController<Content>: UIHostingController<Content> where Content: View {

    override func becomeFirstResponder() -> Bool {
        true
    }
    
    override var keyCommands: [UIKeyCommand]? {
        return [
            UIKeyCommand(input: "1", modifierFlags: [], action: #selector(test)),
            UIKeyCommand(input: "0", modifierFlags: [], action: #selector(test)),
            UIKeyCommand(input: UIKeyCommand.inputLeftArrow, modifierFlags: [], action: #selector(test))
        ]
    }

    @objc func test(_ sender: UIKeyCommand) {
        print(">>> test was pressed")
    }

}

和某处SceneDelegate below

window.rootViewController = KeyTestController(rootView: contentView)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI iOS - 如何捕获硬件按键事件 的相关文章

随机推荐

  • 如何在ActionBar的导航选项卡中设置自定义View并使选项卡适应其高度?

    我正在使用ActionBar我想设置一个自定义View在导航选项卡中 选项卡的高度似乎是固定的 我的自定义View较大 所以不适合 我尝试自定义样式 如下所示 但它并没有使选项卡更高 如何让选项卡的高度适应我的自定义View size 我知
  • 压缩 xml 文件的 Subversion diff

    我正在使用 MySQL Workbench 来维护应用程序的数据库架构 这 mwbWorkbench 使用的文件是一个压缩的 XML 文档 保存在 Subversion 存储库中 该文件被 Subversion 视为二进制数据 因此我无法使
  • 有没有办法跟踪批处理文件的执行情况?

    我继承了一些大型批处理文件 我想将它们重写为更 开发人员友好 的语言 我想了解以下几点 它调用了什么其他脚本 它启动了哪些其他进程 它写入哪些文件 它使用哪些环境变量 设置哪些环境变量 对于最后一点 我知道在开始之前我可以这样做 set g
  • Opengls eglCreateWindowSurface GL 错误 EGL_BAD_ALLOC

    我正进入 状态eglCreateWindowSurface GL Error EGL BAD ALLOC在三星 Galaxy S6 中安装后首次打开应用程序时 相同的代码在其他设备中运行良好 我尝试清理内存并销毁纹理并在销毁时取消初始化所有
  • 无法在 64 位 Linux 上构建 32 位 Wine

    我正在尝试这样做 使用 automake 配置脚本在 64 位 Linux 上构建 32 位 对我不起作用 编译酒 我在 config log 中找到了这个 configure failed program was confdefs h d
  • 使用 Python 处理 MySQL 未读结果

    我使用 mysql connector 进行 SQL 操作 我有一个简短的脚本 它在光标上执行以下操作 字符串 cursor execute use format db show tables command ALTER TABLE Obj
  • 使用 Array.CreateInstance 和 new 运算符实例化数组的区别

    我可以看到以下两种在 C 中实例化 int 数组的方法 通过 API系统 数组抽象类 var arrayInstance Array CreateInstance typeof int 4 通过各种数组初始化语法 var arrayInst
  • PHP 中的自动图像格式检测

    我正在寻找一种方法来获取当前放置在临时位置的用户上传的图像 例如 tmp jkhjkh78 并从中创建 php 图像 自动检测格式 有没有比一堆尝试 捕获 jpeg 图像 png 图像等更聪明的方法来做到这一点 这是的功能之一获取图像大小
  • iPhone 上的内嵌 html5 视频

    我想在 iPhone 上播放 HTML5 视频 但每当我尝试播放时 当调用视频 play 时 iPhone 都会自动弹出全屏 如何在 iPhone 不改变 UI 的情况下内嵌播放视频 如下所示 http www easy bits com
  • 使用 kubernetes 执行器时 Airflow-dag_id 无法找到问题

    我正在使用气流稳定的 Helm Chart 并使用 Kubernetes Executor 正在为 dag 安排新的 pod 但它因 dag id 无法找到问题而失败 我正在使用 git sync 来获取 dags 以下是错误和 kuber
  • UITableViewCell 圆角和剪辑子视图

    我在任何地方 搜索引擎 文档 此处等 都找不到任何内容来显示如何在也剪辑子视图的元素上创建圆角 尤其是在分组表视图中 我有代码可以正确地从具有 4 个弧 圆角 的路径创建一个圆角矩形 该代码已在我的子类 uitableviewcell 中的
  • 在 PHP 中处理格式错误的 JSON

    我正在尝试编写一个 php 脚本来处理来自以字符串形式提供 json 的 Web 服务的数据 问题是字符串并不是真正的 json 这是 JavaScript 具体来说 尽管变量被引用 但键未被引用 示例 实际数据更长且更复杂 desc Us
  • 无法读取 CFPrefsPlistSource iOS 10 中的值

    我今天已将 Xcode 8 更新到 beta 2 并尝试在 App 和 Today Extension 之间共享数据 我面临着这个日志警告 2016 07 08 18 00 24 732472 ProjetctX 941 42801 用户默
  • Junit:为删除实体的方法编写测试?

    最会是什么详尽的我可以为以下代码编写测试吗 public void deleteFromPerson person person person personRepository returnPerson person getId perso
  • 如何将字节数组转换为字符串,反之亦然?

    我必须在 Android 中将字节数组转换为字符串 但我的字节数组包含负值 如果我再次将该字符串转换为字节数组 我得到的值将与原始字节数组值不同 我该怎么做才能获得正确的转换 我用来进行转换的代码如下 Code to convert byt
  • 在 Grafana 仪表板中嵌入网站

    我运行 Grafana 7 2 0 开源版 需要将网站嵌入仪表板本身 也就是说 我需要一排或两排常用的图表面板 并在它们下面嵌入一个需要定期重新加载的外部网站 我怎样才能实现这个目标 貌似没有相关插件https grafana com gr
  • 使用 python selenium 和 Firefox 或 Chrome headless 截取整个页面的屏幕截图

    这篇文章与此相关 Python selenium 屏幕截图无法获取整个页面 PhantomsJS 的解决方案似乎有效 driver webdriver PhantomJS driver maximize window driver get
  • jQuery.Validation.Unobtrusive 客户端验证仅在脚本位于视图页面上时有效

    我有一个ASP NET MVC 4 应用程序使用的是jQuery validation js插件和 MVCjQuery validation unobtrusive js 我在视图模型上使用数据注释来验证文本框的输入是否为整数 此 嵌套 视
  • 找出Python中的正则表达式在字符串中匹配了多少次

    有没有办法可以找出Python字符串中有多少个正则表达式的匹配项 例如 如果我有字符串 It actually happened when it acted out of turn 我想知道多少次 t a 出现在字符串中 在那串字符串中 t
  • SwiftUI iOS - 如何捕获硬件按键事件

    我是 iOS 开发新手 按照教程 我使用 SwiftUI 创建了一个简单的计算器 我的 iPad 连接了键盘 我希望能够使用键盘输入值 如何在 SwiftUI 应用程序 没有文本字段 中捕获和处理硬件键盘事件 我尝试在 SceneDeleg