我想做一个UIKeyCommand只使用[return]密钥的东西.到目前为止,我已经尝试过:
UIKeyCommand *selectCommand = [UIKeyCommand keyCommandWithInput:@"\n" modifierFlags:0 action:@selector(chooseSelection:)];
Run Code Online (Sandbox Code Playgroud)
输入键没有全局常量,例如up,down,left,right和escape(from UIResponder.h):
// These are pre-defined constants for use with the input property of UIKeyCommand objects.
UIKIT_EXTERN NSString *const UIKeyInputUpArrow NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputDownArrow NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputLeftArrow NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputRightArrow NS_AVAILABLE_IOS(7_0);
UIKIT_EXTERN NSString *const UIKeyInputEscape NS_AVAILABLE_IOS(7_0);
Run Code Online (Sandbox Code Playgroud)
还有什么我可以尝试捕获return/enter键吗?
是否可以连续按键?
我正在使用keyCommands:拦截在外部键盘上按下的箭头键,但每次按下我只能拨打1个电话.我希望只要按下按键,每隔X毫秒就可以进行多次调用,或者在按下按键和释放按键时调用.
这是我的代码:
- (NSArray *)keyCommands
{
UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputUpArrow
modifierFlags:0
action:@selector(upArrow:)];
UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputDownArrow
modifierFlags:0
action:@selector(downArrow:)];
UIKeyCommand *leftArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputLeftArrow
modifierFlags:0
action:@selector(leftArrow:)];
UIKeyCommand *rightArrow = [UIKeyCommand keyCommandWithInput:UIKeyInputRightArrow
modifierFlags:0
action:@selector(rightArrow:)];
UIKeyCommand *leftArrowCmd = [UIKeyCommand keyCommandWithInput:UIKeyInputLeftArrow
modifierFlags:UIKeyModifierCommand
action:@selector(leftArrowCmd:)];
UIKeyCommand *rightArrowCmd = [UIKeyCommand keyCommandWithInput:UIKeyInputRightArrow
modifierFlags:UIKeyModifierCommand
action:@selector(rightArrowCmd:)];
UIKeyCommand *lCmd = [UIKeyCommand keyCommandWithInput:@"l"
modifierFlags:UIKeyModifierCommand
action:@selector(lCmd:)];
UIKeyCommand *rCmd = [UIKeyCommand keyCommandWithInput:@"r"
modifierFlags:UIKeyModifierCommand
action:@selector(rCmd:)];
UIKeyCommand *mCmd = [UIKeyCommand keyCommandWithInput:@"m"
modifierFlags:UIKeyModifierCommand
action:@selector(mCmd:)];
return @[upArrow, downArrow, leftArrow, rightArrow, leftArrowCmd, rightArrowCmd, lCmd, …Run Code Online (Sandbox Code Playgroud) 任何人都知道UIKeyCommand在iOS 7上如何检测"删除"键?
由于某种原因,我无法在 iPadOS 15(测试版 5)中使用硬件键盘快捷键。它们适用于大多数键,但不适用于箭头键和 Tab 键。
当在 Xcode 13(beta 4)中编译并在 iPadOS 14.5 模拟器上运行时,相同的代码似乎运行良好,但在使用相同的 Xcode 但在 iPadOS 15 sim 上构建时拒绝工作。我已经在运行 iPadOS 15 beta 5 的实际设备上进行了尝试,结果相同。
这是一个最小的例子:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
addKeyCommand(UIKeyCommand(title: "UP", action: #selector(handle(key:)), input: UIKeyCommand.inputUpArrow, modifierFlags: []))
addKeyCommand(UIKeyCommand(title: "DOWN", action: #selector(handle(key:)), input: UIKeyCommand.inputDownArrow, modifierFlags: []))
addKeyCommand(UIKeyCommand(title: "TAB", action: #selector(handle(key:)), input: "\t", modifierFlags: []))
}
@objc func handle(key: UIKeyCommand?) {
NSLog("Intercepted key: \(key?.title ?? "Unknown")")
}
}
Run Code Online (Sandbox Code Playgroud)
我还没有找到任何相关报告或开放雷达,所以我怀疑我可能在这里遗漏了一些东西。如果应该报告此问题,我应该在哪里报告此类错误?
谢谢。
在 iOS 9 中,开发人员可以使用UIKeyCommand将快捷方式添加到 iPad 应用程序。这些是在外部键盘上输入的,并且函数会做出反应。
有没有办法在mac上的模拟器中测试这些?或者像这样展示它们:
我是 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")
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我通过UIKeyCommand从视图控制器提供实例来支持iOS应用程序中的键盘快捷键.
以下工作类似于魅力,并且每次按下时都会调用提供的选择器e:
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (NSArray *)keyCommands {
return @[
[UIKeyCommand keyCommandWithInput:@"e" modifierFlags:0 action:@selector(foo:)]];
];
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望键命令是⌘+ e,或
[UIKeyCommand keyCommandWithInput:@"e" modifierFlags:UIKeyModifierCommand action:@selector(foo:)]
Run Code Online (Sandbox Code Playgroud)
这仍然有效.它会在你第一次按⌘+ e时不起作用,但之后就会像魅力一样起作用.为什么会发生这种情况,我该如何解决?
我在拦截键盘事件时遇到问题。我已经将我的iOS与SteelSeries Free(游戏手柄控制器)相连,当连接到iOS时,它将被检测为蓝牙键盘。当我打开Notes时进行了测试,按下游戏手柄中的任何按钮都会写一个字母。
我需要拦截此按钮的按下并运行自己的功能,但不幸的是我无法这样做。
我一直在尝试使用GCController,但显然未将其检测为Game Controller对象。当我打印计数时,它显示为0。下面是我的代码。
let gameControllers = GCController.controllers() as! [GCController]
println("configureConnectedGameControllers count: \(gameControllers.count)")
Run Code Online (Sandbox Code Playgroud)
因此,我认为这是因为游戏手柄被检测为蓝牙键盘,因此未将其检测为游戏控制器。因此,我尝试改用UIKeyCommand。下面是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
var keys = [UIKeyCommand]()
for digit in "abcdefghijklmnopqrstuvwxyz"
{
keys.append(UIKeyCommand(input: String(digit), modifierFlags: .Command, action: Selector("keyPressed:")))
keys.append(UIKeyCommand(input: String(digit), modifierFlags: .Control, action: Selector("keyPressed:")))
keys.append(UIKeyCommand(input: String(digit), modifierFlags: nil, action: "pressKey"))
}
}
override func canBecomeFirstResponder() -> Bool {
return true
}
func keyPressed(command: UIKeyCommand) {
println("another key is pressed") //never gets called
}
func pressKey() {
println("a key is pressed")
}
Run Code Online (Sandbox Code Playgroud)
但是即使使用上述实现,当我按下游戏手柄上的按钮时,控制台上也不会打印任何内容。
这使我感到困惑。因此,如果您对此有任何答案,请帮助我。提前致谢!
当用户按下硬件键盘上的向下箭头时,我尝试在表视图中选择一行。现在,我只是想打印日志,但似乎无法让它工作。根据其他类似问题的答案,这是我到目前为止所得到的:
- (NSArray *)keyCommands {
UIKeyCommand *downArrowKeyCommand = [UIKeyCommand keyCommandWithInput:UIKeyInputDownArrow
modifierFlags:0
action:@selector(hardwareKeyboardDownArrowPressed)];
return @[downArrowKeyCommand];
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)hardwareKeyboardDownArrowPressed {
NSLog(@"Down arrow pressed on external keyboard");
}
Run Code Online (Sandbox Code Playgroud)
感谢所有帮助!
如果注册了按键命令,则如果用户按住按键时间过长,则可能多次调用该操作。这会产生非常奇怪的效果,就像?N可以多次重复打开新视图一样。是否有任何简单的方法可以停止这种行为,而无需诉诸布尔值“已经触发”标志?
这是我注册两个不同的键盘命令的方法:
#pragma mark - KeyCommands
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (NSArray<UIKeyCommand *>*)keyCommands {
return @[
[UIKeyCommand keyCommandWithInput:@"O" modifierFlags:UIKeyModifierCommand action:@selector(keyboardShowOtherView:) discoverabilityTitle:@"Show Other View"],
[UIKeyCommand keyCommandWithInput:@"S" modifierFlags:UIKeyModifierCommand action:@selector(keyboardPlaySound:) discoverabilityTitle:@"Play Sound"],
];
}
- (void)keyboardShowOtherView:(UIKeyCommand *)sender {
NSLog(@"keyboardShowOtherView");
[self performSegueWithIdentifier:@"showOtherView" sender:nil];
}
- (void)keyboardPlaySound:(UIKeyCommand *)sender {
NSLog(@"keyboardPlaySound");
[self playSound:sender];
}
#pragma mark - Actions
- (IBAction)playSound:(id)sender {
AudioServicesPlaySystemSound(1006); // Not allowed in the AppStore
}
Run Code Online (Sandbox Code Playgroud)
可以在此处下载示例项目:TestKeyCommands.zip
uikeycommand ×11
ios ×8
ipad ×3
objective-c ×3
keyboard ×2
uiresponder ×2
cocoa ×1
ios15 ×1
ios7 ×1
ipados ×1
ipados15 ×1
iphone ×1
react-native ×1
swift ×1
swiftui ×1