события касания клавиатуры iphone - PullRequest
2 голосов
/ 10 августа 2010

Мне нужно иметь возможность обнаруживать сенсорные события на клавиатуре.У меня есть приложение, которое показывает экран, который появляется после определенного периода бездействия (то есть без событий касания). Чтобы решить эту проблему, я создал подкласс своего UIWindow и реализовал функцию sendEvent, которая позволяет получать события касания во всем приложенииРеализация метода в одном месте.Это работает везде, когда клавиатура представлена, и пользователь печатает на клавиатуре.Что мне нужно знать, так это то, что есть способ обнаружения сенсорных событий на клавиатуре, что-то вроде того, что sendEvent делает для uiWindow.Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 10 августа 2010

нашел решение проблемы. если вы наблюдаете следующие уведомления, вы можете получить событие, когда клавиша нажата. Я добавил эти уведомления в свой пользовательский класс uiwindow, поэтому выполнение этого в одном месте позволит мне получать эти сенсорные события во всем приложении.

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

В любом случае, надеюсь, это поможет кому-то еще.

0 голосов
/ 30 ноября 2010

iPhoneDev: вот что я делаю.

У меня есть пользовательский объект UIWindow. В этом объекте есть NSTimer, который сбрасывается при каждом касании. Чтобы получить это прикосновение, вы должны переопределить метод sendEvent в UIWindow.

вот как выглядит метод 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 пользовательского класса окна, и вы сможете получать 99% всех сенсорных событий на экране в любом месте приложения.

...