2

キーボードのタッチ イベントを検出できる必要があります。一定期間非アクティブの後に発生する画面を表示するアプリがあります (つまり、タッチ イベントがありません)。この問題を解決するために、UIWindow をサブクラス化し、sendEvent 関数を実装しました。これにより、アプリケーション全体でタッチ イベントを取得できます。メソッドを 1 か所に実装します。これは、キーボードが表示され、ユーザーがキーボードで入力しているとき以外はどこでも機能します。私が知る必要があるのは、キーボードのタッチイベントを検出する方法があるということです.uiWindowに対してsentEventが行うようなものです。前もって感謝します。

4

2 に答える 2

4

問題の解決策を見つけました。次の通知を確認すると、キーが押されたときにイベントを取得できます。これらの通知をカスタム 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];  }

とにかく、それが他の誰かに役立つことを願っています。

于 2010-08-10T14:21:40.150 に答える
0

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];
}

この後、idleTimerExceededで、ウィンドウデリゲート(この場合はappDelegate)にメッセージを送信します。

- (void)idleTimerExceeded
{
    [MY_CUSTOM_WINDOW_Delegate idleTimeLimitExceeded];
}

appDelegateでこのカスタムウィンドウオブジェクトを作成するとき、appDelegateをこのウィンドウのデリゲートとして設定します。そして、appDelegateのidleTimeLimitExceededの定義では、タイマーの期限が切れたときに必要なことを実行します。重要なのは、カスタムウィンドウを作成し、sendEvent関数をオーバーライドすることです。これを、カスタムウィンドウクラスのinitメソッドに追加した上記の2つのキーボード通知と組み合わせると、アプリケーションのどこでも画面上のすべてのタッチイベントの99%を取得できるはずです。

于 2010-11-30T19:05:32.080 に答える