私のアプリケーションですべてのキーボードイベントをトラップする方法はありますか?私は、ユーザーが私のアプリケーション(アプリケーションは複数のビューを持っている)のキーボードを使って何かを入力しているかどうかを知る必要があります。私はUIWindowをサブクラス化してキーボードイベントをキャプチャすることができないため、touchEventsをキャプチャすることができました。iPhoneのキーボードイベントを受け取ります
答えて
使用NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextFieldTextDidChangeNotification object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextViewTextDidChangeNotification object: nil];
........
-(void) keyPressed: (NSNotification*) notification
{
NSLog([[notification object]text]);
}
簡単な答えではありませんが、2つの方法があります。
UIWindowで行ったように入力コンポーネント(UITextView、UITextFieldなど)をサブクラス化します。
アプリケーション全体のUITextViewDelegate(およびUITextFieldDelegate)を作成し、すべての入力フィールド代理人を割り当てます。
私はを参照してください私のブログ
でたUIEventの少しハックを使用してイベントをキャッチについて書いた:詳細については Catching Keyboard Events in iOS。
上記のブログから:
トリックは直接GSEventKey構造体のメモリにアクセスしており、押されたキーのキーコードとフラグを知って 特定のバイトを確認してください。 以下のコードはほとんど説明がなく、 UIApplicationサブクラスに配置する必要があります。
#define GSEVENT_TYPE 2
#define GSEVENT_FLAGS 12
#define GSEVENTKEY_KEYCODE 15
#define GSEVENT_TYPE_KEYUP 11
NSString *const GSEventKeyUpNotification = @"GSEventKeyUpHackNotification";
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
if ([event respondsToSelector:@selector(_gsEvent)]) {
// Key events come in form of UIInternalEvents.
// They contain a GSEvent object which contains
// a GSEventRecord among other things
int *eventMem;
eventMem = (int *)[event performSelector:@selector(_gsEvent)];
if (eventMem) {
// So far we got a GSEvent :)
int eventType = eventMem[GSEVENT_TYPE];
if (eventType == GSEVENT_TYPE_KEYUP) {
// Now we got a GSEventKey!
// Read flags from GSEvent
int eventFlags = eventMem[GSEVENT_FLAGS];
if (eventFlags) {
// This example post notifications only when
// pressed key has Shift, Ctrl, Cmd or Alt flags
// Read keycode from GSEventKey
int tmp = eventMem[GSEVENTKEY_KEYCODE];
UniChar *keycode = (UniChar *)&tmp;
// Post notification
NSDictionary *inf;
inf = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithShort:keycode[0]],
@"keycode",
[NSNumber numberWithInt:eventFlags],
@"eventFlags",
nil];
[[NSNotificationCenter defaultCenter]
postNotificationName:GSEventKeyUpNotification
object:nil
userInfo:userInfo];
}
}
}
}
}
「[外部リソースへのリンクを正しく作成するにはどうすればよいですか?」](http://meta.stackexchange.com/questions/94022/how-could -i-write-my-answer-that-external-resource-that-external-resource-appropriate)を使用します。 –
私は何を得たのか分かりません。はい、リンクは私のブログの投稿にありますが、この質問には完全に答えています。それはShift、Cmd、Ctrl、Altを含むすべてのキーボードイベントをキャッチします。 Private APIを使用している場合は、** hack **と明示しました。私はここで誰かをだましていません。 – nacho4d
おそらくあなたの答えが質問に答えないので、それは消えたり、壊れたり、単にこの質問を超えて変わる可能性のある外部ソースを指しているだけです。 Learが指摘するように、彼女が指摘したセクションを読んでください。答えは以下の適切な規則に従うことを指しています: - リンクされたアイテムの内容を言い換えれば(詳細や例を省略するかもしれない) - あなたは自分自身を識別します(自分自身、MSDNなど) - 誰かがリンクされたアイテムを一切読まずに答えてください - リンクをクリックする価値があるかどうかを読者に知らせるための情報が含まれています – Coyote
- 1. 部分的なRESTレスポンスを受け取ったまま受け取ります
- 2. Win32アプリケーションでホストされる非モーダルWPFダイアログはキーボードイベントを受け取りません
- 3. ajaxリクエストを受け取ります
- 4. clearcase_albd - クリアケースライセンスを受け取りますか?
- 5. ストライプパブリックURLを受け取ります
- 6. didEndEditingRowAtIndexPathはnilを受け取ります
- 7. NSWindowはキーボードイベントを受信しません
- 8. フォーカスされていないQtQuickアイテムでキーボードイベントを受け取る方法
- 9. キーボードイベントをhtml5キャンバスに貼り付けて
- 10. 受信リスナーonResults()を別のアクティビティから受け取ります
- 11. PythonはPOSTリクエストからformDataを受け取り、ストリームを取得し、File Corruptを受け取ります。
- 12. TypeInitializationExceptionを受け取りました
- 13. クラスをテンプレートパラメータとして受け取り、メソッドコンストラクタとしてクラスコンストラクタのパラメータを受け取ります。
- 14. Pythonのリストのリストを受け取り、
- 15. 間違ったiPhoneアプリの通知を受け取る
- 16. クエリはSQLより小さいレコードを受け取ります
- 17. 受信トレイを読み取って、エラー#298を受け取りました
- 18. iPhoneでローカル通知を受け取る方法
- 19. Linux .Netコア受け取りソケットで受け渡し
- 20. Javaでのパスカルマウスの動きを受け取ります
- 21. API 23/MarshmallowのonOptionsItemSelected()内のrecreate()エラーを受け取ります
- 22. CouchDBのデータをMySQLのINとして受け取ります
- 23. .htaccessはファイルの他のURLを受け取ります
- 24. 画像のリンクは、幅の幅を受け取ります
- 25. Facebook Graph Batchは、トップレベルのaccess_tokenのみを受け取ります
- 26. オラクルのinsert文の値を受け取ります(ネガティブ番号)
- 27. 単一のテストのSonarqubeカバレッジ結果を受け取ります
- 28. 最初のSocketTimeoutExceptionの後にEOFExceptionを受け取ります
- 29. データテーブルのみ最初の行はjqueryを受け取ります。
- 30. シェルの実装の履歴はセグメンテーションエラーを受け取ります
これは少し難解であり、多くの作業が必要です。キャプチャするAppレベルのイベントがいくつか見られることを願っていました – iamMobile