iPhoneキーボードタッチイベント
-
27-09-2019 - |
質問
キーボードのタッチイベントを検出できる必要があります。この問題を解決するために、一定の期間の不活動(つまりタッチイベントなし)の後に発生する画面を表示するアプリがあります。uiwindowをサブクラス化し、Sendevent関数を実装しました。メソッドを1か所で実装します。これは、キーボードが提示され、ユーザーがキーボードで入力しているときにどこでも機能します。私が知る必要があるのは、キーボードのタッチイベントを検出する方法があるということです。前もって感謝します。
解決
問題の解決策を見つけました。次の通知を観察すると、キーが押されたときにイベントを取得できます。これらの通知をカスタムUiWindowクラスに追加して、1か所でそれを行うことで、アプリケーション全体でこれらのタッチイベントを取得できます。
[[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
{ [self resetIdleTimer]; }
とにかく、それが他の誰かを助けることを願っています。
他のヒント
iPhonedev:これが私がやっていることです。
カスタムUiWindowオブジェクトがあります。このオブジェクトには、タッチがあるたびにリセットされるnstimerがあります。このタッチを得るには、uiwindowのsendeventメソッドをオーバーライドする必要があります。
これは、私のカスタムウィンドウクラスでsendeventメソッドがどのように見えるかです。
- (void)sendEvent:(UIEvent *)event
{
if([super respondsToSelector: @selector(sendEvent:)])
{
[super sendEvent:event];
}
else
{
NSLog(@"%@", @"CUSTOM_Window super does NOT respond to selector sendEvent:!");
ASSERT(false);
}
// Only want to reset the timer on a Began touch or an Ended touch, to reduce the number of timer resets.
NSSet *allTouches = [event allTouches];
if ([allTouches count] > 0)
{
// anyObject works here.
UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
if (phase == UITouchPhaseBegan || phase == UITouchPhaseEnded)
{
[self resetIdleTimer];
}
}
}
これがresetidletimerです:
- (void)resetIdleTimer
{
if (self.idleTimer)
{
[self.idleTimer invalidate];
}
self.idleTimer = [NSTimer scheduledTimerWithTimeInterval:PASSWORD_TIMEOUT_INTERVAL target:self selector:@selector(idleTimerExceeded) userInfo:nil repeats:NO];
}
この後、Idletimerexの成功では、ウィンドウ代表者(この場合はAppDelegate)にメッセージを送信します。
- (void)idleTimerExceeded
{
[MY_CUSTOM_WINDOW_Delegate idleTimeLimitExceeded];
}
AppDelegateでこのカスタムウィンドウオブジェクトを作成すると、AppDelegateをこのウィンドウのデリゲートとして設定します。また、AppDelegateでは、Idletimelimitexが成功したことの定義は、タイマーの有効期限が切れたときに必要なことをする場所です。重要なことは、カスタムウィンドウを作成し、SendEvent関数をオーバーライドすることです。これを上に示した2つのキーボード通知と組み合わせて、カスタムウィンドウクラスのinitメソッドに追加すると、アプリケーションのどこでも画面上のすべてのタッチイベントの99%を取得できるはずです。