繁体   English   中英

如何在 Mac Catalyst 应用程序中禁用默认键盘导航?

[英]How to disable default keyboard navigation in Mac Catalyst app?

我注意到我可以通过按 Mac 键盘上的向上和向下箭头键在 Mac Catalyst 应用程序中单步执行UITableView中的行。 但是,这会干扰我的一个视图控制器中的现有功能。 有没有办法禁用它?

我在UITableView文档中找不到对此功能的任何引用。 Mac Catalyst 的人机界面指南提到“自动支持基本的 Mac 功能,例如...键盘导航”,所以我想这是一个有意的功能,但我找不到任何进一步的参考或文档。

我没有在我的应用程序中看到任何其他“自动”键盘导航的示例,但理想情况下,Apple 会发布一个完整的列表,以便我们知道如何使用,或者如果需要,禁用内置功能。

Catalyst 自动将向上/向下箭头的 UIKeyCommands 分配给UITableView实例。 这不会发生在 iOS 上。 您可以通过在UITableViewControllerviewDidLoad()中设置断点并检查tableView.keyCommands来看到这一点。

所以我创建了一个非常简单的UITableView子类,并通过返回 nil 来禁用默认的keyCommmands

class KeyCommandDisabledTableView: UITableView {
    override var keyCommands: [UIKeyCommand]? {
        return nil
    }
}

然后我更新了我的UITableViewController子类以使用新的KeyCommandDisabledTableView子类:

class MyTableViewController: UITableViewController {
    override func loadView() {
        self.view = KeyCommandDisabledTableView(
            frame: .zero, 
            style: .plain // or .grouped
        )
    }
}

等等瞧。 默认箭头键处理已消失,现在正在调用我的应用程序的自定义箭头键处理。

我进一步注意到,默认箭头键导航仅在单击表格中的一行后才开始,所以我猜该表格必须承担第一响应者角色。 我将此添加到我的表的代表 class 中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    #if TARGET_OS_MACCATALYST
    [tableView performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0.1];
    #endif
}

修复了它,现在默认键盘导航一打开就会关闭。 并且不会干扰我的应用程序的自定义键盘导航。

(它没有延迟工作。)

由于 UITableView 和 UICollectionView 的selectionFollowsFocus属性,iOS 14 / macOS 11 使禁用此行为变得更加容易:

tableView.selectionFollowsFocus = false

这是我从 Apple DTS 收到的另一个解决方案。 只需将其添加到表视图委托:

func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool {
    return false
}

这适用于 macOS 11.6 和 12.0。 我没有要测试的 10.15 Mac,所以我也会保留我之前的resignFirstResponder解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM