如何在没有文本框的情况下获取键盘事件?
Posted
技术标签:
【中文标题】如何在没有文本框的情况下获取键盘事件?【英文标题】:How do I get keyboard events without a textbox? 【发布时间】:2014-06-08 14:00:22 【问题描述】:在我的 Xamarin.ios 应用 (C#) 中,我有一个 iPhoneOSGameView
(继承自 UIView
),我想从外部(比如蓝牙)键盘捕获按键。
由于这是在游戏中添加对键盘控制的支持,我希望能够响应这些事件,而不必像 this question 中建议的那样放置文本框或任何其他文本字段(实际上,它们不是捕获按键,但文本框发生变化,这与我想要做的完全不同)
在 android 中,我可以通过在我的活动中覆盖 OnKeyDown
和 OnKeyUp
来实现这一点,但在 UIView
或 UIViewController
上似乎没有类似的事件。
有没有办法在UIView
或UIViewController
中捕获按键和按键释放?
由于这是针对 Xamarin.iOS 的,我当然更喜欢 C# 答案,但我想如果需要我可以阅读 Objective-C。
【问题讨论】:
@TaW:你为什么要删除 c# 标签?这是针对 C# 程序的,我期待 C# 的答案。如果要删除语言标签,它将是objective-c 标签。我离开了 Objective-c,因为 Objective-c 的答案在某种程度上也被接受了,但是 C# 更受欢迎,因为我自己不能完全理解 Objective-c。 对不起!但是我在您的帖子中没有看到与 C# 的联系。因此,如果是,请尝试在 Tag 中同时指定您的平台(WPF、ASP、Winforms)!啊Monotouch
,那个不见了!
@TaW:monotouch 标签从一开始就存在。说这是用于“Xamarin.iOS”的部分也从一开始就存在。我在文本中添加了一些说明,以确保每个人都理解这是 c#。
好吧,让我们承认我错了 ;-)
【参考方案1】:
要在UIView
上获取键盘事件,您需要adopt the UIKeyInput
protocol。
为此,首先你必须用[Adopts("UIKeyInput")]
装饰你的视图类。
然后,你需要实现UIKeyInput
所需的所有方法:
[Export("hasText")]
bool HasText get return false;
[Export("insertText:")] // Don't forget the colon
void InsertText(string text) // This is what gets called on a key press
[Export("deleteBackward")]
void DeleteBackward()
最后,你必须让 iOS 知道这可以成为第一响应者(不管是什么):
public override bool CanBecomeFirstResponder get return true;
然后,当视图出现时,您必须成为第一响应者,例如在WillEnterForeground
:
view.BecomeFirstResponder();
当视图离开焦点时不要忘记成为第一响应者,例如在DidEnterBackground
:
view.ResignFirstResponder();
最后,最好实现inputView
并让它返回一个空的UIView
,这样默认键盘就不会出现:
private UIView inputView;
// ...
inputView = new UIView(new RectangleF());
// And somewhere else...
[Export("inputView")]
public new UIView InputView get return inputView;
感谢聊天中的@radical 帮助我解决了这个问题。
此解决方案不是关于获取按键按下和按键向上事件,而是关于创建一个新的文本框。如果其他人指出如何实际获得较低级别的按键和按键事件,那将是非常棒的,如果这可能的话。
【讨论】:
这是一个非常好的答案,它对我很有用。您应该将其标记为已接受的答案。以上是关于如何在没有文本框的情况下获取键盘事件?的主要内容,如果未能解决你的问题,请参考以下文章
从 Windows 10 虚拟键盘输入到 WPF 文本框中的快乐表情符号未在文本框的 PreviewTextInput 事件中捕获