2017-01-17 2 views
11

У меня странная проблема с моим приложением, созданным с помощью Ionic 1.3.2, которое происходит только на iOS.Клавиатура открывается после нажатия на пустое место

Когда я нажимаю на ввод текстового поля, клавиатура открывается, как обычно, эта часть работает так, как ожидалось, и элемент input получает фокус.

Однако, когда я нажимаю на определенные области экрана вне любых входов, например 20px ниже текстового поля, которое у меня есть, клавиатура либо opsn, либо закрывается и снова открывается сразу, если она уже открыта, но input doesn 't получить фокус, и document.activeElement фактически возвращает элемент body (проверяется в инспекторе Safari).

Так что в этом режиме я могу напечатать все, что захочу, но введенный текст не появляется нигде, как если бы я печатал в никуда (что немного странно).

Кроме того, если я нажму 2-3 раза в одном из тех мест, весь приложение падает с EXC_BAD_ACCESS внутри некоторых UIWebView внутренностей:

* thread #1: tid = 0x35ea78, 0x000000010c2c3acb libobjc.A.dylib`objc_msgSend + 11, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT) 
    * frame #0: 0x000000010c2c3acb libobjc.A.dylib`objc_msgSend + 11 
    frame #1: 0x000000010ec56024 UIKit`-[UITextInteractionAssistant(UITextInteractionAssistant_Internal) swallowsDoubleTapWithScale:atPoint:] + 264 
    frame #2: 0x000000010ea4ce75 UIKit`-[UIWebDocumentView shouldSelectionAssistantReceiveDoubleTapAtPoint:forScale:] + 91 
    frame #3: 0x000000010f1b930a UIKit`_UIWebDoubleTapAtLocation + 369 
    frame #4: 0x000000010ec3d409 UIKit`-[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 57 
    frame #5: 0x000000010ec451a8 UIKit`_UIGestureRecognizerSendTargetActions + 109 
    frame #6: 0x000000010ec42c77 UIKit`_UIGestureRecognizerSendActions + 227 
    frame #7: 0x000000010ec41f03 UIKit`-[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 891 
    frame #8: 0x000000010ec2df7e UIKit`_UIGestureEnvironmentUpdate + 1395 
    frame #9: 0x000000010ec2d9c3 UIKit`-[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 521 
    frame #10: 0x000000010ec2cba6 UIKit`-[UIGestureEnvironment _updateGesturesForEvent:window:] + 286 
    frame #11: 0x000000010e772c1d UIKit`-[UIWindow sendEvent:] + 3989 
    frame #12: 0x000000010e71f9ab UIKit`-[UIApplication sendEvent:] + 371 
    frame #13: 0x000000010ef0c72d UIKit`__dispatchPreprocessedEventFromEventQueue + 3248 
    frame #14: 0x000000010ef05463 UIKit`__handleEventQueue + 4879 
    frame #15: 0x000000010c819761 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    frame #16: 0x000000010c7fe98c CoreFoundation`__CFRunLoopDoSources0 + 556 
    frame #17: 0x000000010c7fde76 CoreFoundation`__CFRunLoopRun + 918 
    frame #18: 0x000000010c7fd884 CoreFoundation`CFRunLoopRunSpecific + 420 
    frame #19: 0x0000000111fc8a6f GraphicsServices`GSEventRunModal + 161 
    frame #20: 0x000000010e701c68 UIKit`UIApplicationMain + 159 
    frame #21: 0x000000010aa7bd81 MyApp`main(argc=1, argv=0x00007fff55184680) + 65 at main.m:32 
    frame #22: 0x000000010e42f68d libdyld.dylib`start + 1 

Любой знает, как это исправить?

Я использую Ionic 1.3.2. Это, похоже, не проблема с плагином Ionic Keyboard, потому что то же самое происходит, даже если я удалю его.

Edit (Как воспроизвести):

Вот sample project, что вы можете использовать, чтобы воспроизвести проблему (KeyboardBugRepro.zip). Вам необходимо будет сделать следующее, чтобы запустить его после того, как вы извлекли архив:

  1. Установить Node.js. Если вы используете Hombrew запустить brew install node
  2. Установки ионных и Кордовы во всем мире с НПМ: npm install -g ionic cordova
  3. Если может потребоваться для запуска «ионная подготовки» перед запуском проекта, но вы можете перейти к следующему шагу сначала и посмотреть, если оно работает.
  4. Пробег ionic emulate ios. Это запустит симулятор iPhone SE и запустит приложение.
  5. Убедитесь, что вы отключили аппаратную клавиатуру в вариантах симулятора (Оборудование -> Клавиатура> снимите флажок Подключить аппаратную клавиатуру).

Когда приложение запустится, вы увидите экран входа в систему. Теперь нажмите немного ниже ввода пароля и наблюдайте, как открывается клавиатура программного обеспечения, но вход не фокусируется. Но если вы нажимаете на вход напрямую, он фокусируется. Щелчок на пустое место закроет клавиатуру.

Воспроизведение аварии просто делает то же самое несколько раз подряд очень быстро, обычно достаточно 2-3 щелчков.

Для запуска проекта из Xcode просто откройте проект, созданный ионным, в <project>/platforms/ios/KeyboardBug.xcodeproj и нажмите Run.

+0

выглядит как ошибка ios и webview. Вы пробовали решение, упомянутое здесь - https://github.com/driftycoionion-plugin-keyboard/issues/217 – Gandhi

+0

У вас была возможность проверить это? – Gandhi

+0

@ Gandhi Это другая ошибка, я думаю. Я добавлю ссылку на сообщение с шагами, чтобы воспроизвести это, вы можете взглянуть, если хотите. Я также опубликовал отчет об ошибке Apple против Safari и в основном отправил им тот же код сегодня. Я обновлю сообщение, когда узнаю от них. – iosdude

ответ

2

Удалить все eventListeners и проверить. Я думаю, что в одном из них есть место столкновения, которое активирует «ошибки».

3

Чтобы удалить клавиатуру, вам необходимо потерять фокус на вашем входе.

document.activeElement.blur(); 

С помощью этой линии вы удаляете фокус, и клавиатура исчезает.

В вашем случае можно добавить событие на свое тело и снова открыть клавиатуру, если вы щелкнете по вводу.

$(document).ready(function() { 
    $('body').click(function() { 
    document.activeElement.blur(); 
    }); 
+0

Это не исправить проблему - вы скрываете только ее последствия (если приложение не будет разбиваться первым, как упоминалось). Кроме того, не будет "document.activeElement.blur();" скрыть ЛЮБЫЕ активные элементы? – Hekkaryk

+0

см. Это http://stackoverflow.com/questions/5937339/ipad-safari-make-keyboard-disappear –

+1

@AkshayTilekar Ответ никоим образом не связан с вопросом пользователя – Gandhi

Смежные вопросы