Недавно я добавил поддержку аппаратной клавиатуры. Чтобы получать ключевые события, я реализовал canBecomeFirstResponder и заставил его всегда возвращать YES, и я вызываю gotFirstResponder всякий раз, когда главное окно становится активным, и resignFirstResponder, когда оно становится неактивным.
Это работает нормально, за исключением одного сценария: при запуске приложения на iPad вместе с другим приложением с использованием разделенного просмотра или слайд-шоу, а в другом приложении фокус клавиатуры находится на текстовом поле, мое приложение не получает события клавиатуры, даже если это приложение на переднем плане. Мне нужно зайти в другое приложение и нажать где-нибудь за пределами текстового поля, а затем вернуться в свое приложение, прежде чем мое приложение снова получит ключевые события.
Если пользователь нажимает на фактическое текстовое поле в моем приложении, оно, конечно, прекрасно получает фокус, но, видимо, моего вызова UIView статьFirstResponder недостаточно, чтобы отобрать фокус у другого приложения.
Есть ли способ чтобы перехватить фокус из текстового поля другого приложения в этот сценарий?
ОБНОВЛЕНИЕ: Чтобы уточнить: я не собираюсь идти вразрез с намерениями пользователя. Целью не является подслушивание или саботаж. Проблема в том, что мой подкласс UIView пытается действовать как текстовый виджет и не может сделать это в одном отношении, а именно: получить фокус, когда другое приложение имеет сфокусированное текстовое поле, в то время как это другое приложение находится в фоновом режиме.< /strong> Тот факт, что приложение может продолжать получать ввод с клавиатуры, в то время как пользователь активировал другое приложение, кажется мне неправильным, и мне любопытно, как UITextField может получить фокус в этой ситуации, в то время как мой класс не может. p>
ОБНОВЛЕНИЕ 2: Соответствующий код выглядит следующим образом:
Код: Выделить всё
@interface CalcView : UIView {
//
}
[...]
@implementation CalcView
[...]
- (void) setActive:(bool) active {
if (active)
[self becomeFirstResponder];
else
[self resignFirstResponder];
}
- (BOOL) canBecomeFirstResponder {
return YES;
}
// Keyboard handling (UIResponder methods)
// Tells this object when a physical button is first pressed.
- (void)pressesBegan:(NSSet *)presses withEvent:(UIPressesEvent *)event {
NSArray *p = [presses allObjects];
bool handled = false;
for (int i = 0; i < [p count]; i++) {
UIPress *pr = [p objectAtIndex:i];
// handle the key
}
if (!handled)
[super pressesBegan:presses withEvent:event];
}
// Tells the object when a button is released.
- (void)pressesEnded:(NSSet *)presses withEvent:(UIPressesEvent *)event {
NSArray *p = [presses allObjects];
// handle the events
if (!handled)
[super pressesEnded:presses withEvent:event];
}
// Tells this object when a value associated with a press has changed.
- (void)pressesChanged:(NSSet *)presses withEvent:(UIPressesEvent *)event {
// No need to handle this
[super pressesChanged:presses withEvent:event];
}
// Tells this object when a system event (such as a low-memory warning) cancels a press event.
- (void)pressesCancelled:(NSSet *)presses withEvent:(UIPressesEvent *)event {
// No need to handle this
[super pressesCancelled:presses withEvent:event];
}
Но если есть другое активное параллельное приложение -side в режиме Slide Over, и в этом приложении есть текстовое поле, на котором находится фокус (например, строка URL-адреса в Safari), тогда нажатие на мое приложение не отвлекает фокус от другого приложения. Когда я открываю в своем приложении другое представление, содержащее текстовое поле, и устанавливаю фокус на это текстовое поле, оно, как и следовало ожидать, забирает ввод из другого приложения, и если я затем возвращаюсь к CalcView , он получает ввод с клавиатуры. Я пытаюсь выяснить, что делает это текстовое поле, чтобы отвлечь внимание от другого приложения, и воспроизвести это поведение в моем классе CalcView.
Подробнее здесь: https://stackoverflow.com/questions/792 ... text-field
Мобильная версия