Подтвердить что ты не робот

IOS автоматически отключает Quicktype Keyboard в UIWebBrowserView

Я разрабатываю приложение PhoneGap для iOS, и мне нужно отключить автоматический интеллектуальный текст на клавиатуре.

Я нашел множество решений для UITextView следующим образом:

Программно отключить iOS8 Quicktype Keyboard в UITextView

ios8 xcode как удалить QuickType на UIKeyboard (автообновление/автоматическое предложение)

... но приложение PhoneGap имеет UIWebBrowserView внутри.

Также я знаю о атрибутах html для отключения автоматического предсказания. Они работают хорошо только для регулярных html-входов, но у меня есть элемент contenteditable на моем UIWebBrowserView, который является редактируемой областью текстового редактора (CKEditor в моем случае).

<!-- Does not work -->
<div contenteditable="true" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false">
</div>

Итак, есть ли способ отключить функцию автоопределения для контентно-ориентированных элементов программно на iOS?

Поблагодарите любую помощь!

4b9b3361

Ответ 1

Недавно я столкнулся с этой проблемой в родном приложении (а не в PhoneGap), где размещен UIWebView, и не смог его решить, изменив HTML. Я предлагаю подавать ошибку с Apple.

Я смог заставить клавиатуру отобразить sans QuickType с довольно сложной схемой, которая, я уверен, не будет передавать рекомендации App Store:

1) Следите за уведомлениями UIKeyboardWillShowNotification

2) Когда клавиатура появляется, найдите первого ответчика - это будет некоторый вид внутри UIWebView

3) Динамически подклассифицируйте это представление, чтобы предоставить альтернативную реализацию метода textInputTraits (который возвращает объект соответствия UITextInputTraits). Установите autocorrectionType на этом возвращенном объекте на UITextAutocorrectionTypeNo.

4) Вызовите reloadInputViews на первый вид ответчика - дважды.

Я понимаю, что все это вряд ли поможет вам или решит вашу конкретную проблему, но, возможно, это поможет кому-то.

Ответ 2

Единственный способ, которым я нашел - это использовать частный API:

UIWebBrowserView *browserView = _myBrowserView;

NSString *spellChecking [email protected]"setContinuousSpellCheckingEnabled:";
SEL enableSpellCheckingSelector = NSSelectorFromString(spellChecking);

NSMethodSignature* signature = [[browserView class] instanceMethodSignatureForSelector:enableSpellCheckingSelector];
if (!signature)
    return;
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:browserView];
[invocation setSelector:enableSpellCheckingSelector];
[invocation setArgument:&enabled atIndex:2];
[invocation invoke];

Он работает для меня на iOS7 и iOS8.

Однако с такой трюкой вы не можете пройти проверку Apple.

Ответ 3

Метод Swizzling может помочь.

1.Создание справки: UITextView + CloseQuickType.h и UITextView + CloseQuickType.m

2.Загрузить jrswizzle в github

3.UITextView + CloseQuickType.m:

#import "UITextView+CloseQuickType.h"
#import <objc/runtime.h>
#import "JRSwizzle.h"
@implementation UITextView (CloseQuickType)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //exchange init methods
        [self jr_swizzleMethod:@selector(init) withMethod:@selector(init_) error:nil];
        [self jr_swizzleMethod:@selector(initWithFrame:) withMethod:@selector(initWithFrame_:) error:nil];
        [self jr_swizzleMethod:@selector(initWithCoder:) withMethod:@selector(initWithCoder_:) error:nil];
    });
}
#pragma mark - myInitMethods
- (instancetype)init_ {
    self = [self init_];
    if (self) {
        self.autocorrectionType = UITextAutocorrectionTypeNo;
    }
    return self;
}
- (instancetype)initWithFrame_:(CGRect)frame {
    self = [self initWithFrame_:frame];
    if (self) {
        self.autocorrectionType = UITextAutocorrectionTypeNo;
    }
    return self;
}
- (instancetype)initWithCoder_:(NSCoder *)aDecoder {
    self = [self initWithCoder_:aDecoder];
    if (self) {
        self.autocorrectionType = UITextAutocorrectionTypeNo;
    }
    return self;
}
@end

Приложение 4.Run.

PS: Я пробовал

[[UITextView appearance] setAutocorrectionType:UITextAutocorrectionTypeNo];

чтобы изменить настройку по умолчанию, но сбой в Xcode7, ios9.