質問

キーボードのタッチイベントを検出できる必要があります。この問題を解決するために、一定の期間の不活動(つまりタッチイベントなし)の後に発生する画面を表示するアプリがあります。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%を取得できるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top