Как украсть фокус из текстового поля другого приложения?IOS

Программируем под IOS
Ответить
Anonymous
 Как украсть фокус из текстового поля другого приложения?

Сообщение Anonymous »

Я написал приложение-калькулятор. Его главное окно представляет собой подкласс UIView, который обычно получает пользовательский ввод с сенсорного экрана, нажимая на виртуальную клавиатуру (а не на стандартную всплывающую клавиатуру).
Недавно я добавил поддержку аппаратной клавиатуры. Чтобы получать ключевые события, я реализовал 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];
}
Метод setActive вызывается ViewController, когда он становится видимым. Я перехватил вызовы [UIWindow makeKey] и [UIView статьFirstResponder] и убедился, что все они вызываются в ожидаемый момент.
Но если есть другое активное параллельное приложение -side в режиме Slide Over, и в этом приложении есть текстовое поле, на котором находится фокус (например, строка URL-адреса в Safari), тогда нажатие на мое приложение не отвлекает фокус от другого приложения. Когда я открываю в своем приложении другое представление, содержащее текстовое поле, и устанавливаю фокус на это текстовое поле, оно, как и следовало ожидать, забирает ввод из другого приложения, и если я затем возвращаюсь к CalcView , он получает ввод с клавиатуры. Я пытаюсь выяснить, что делает это текстовое поле, чтобы отвлечь внимание от другого приложения, и воспроизвести это поведение в моем классе CalcView.

Подробнее здесь: https://stackoverflow.com/questions/792 ... text-field
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»