iOS在UIWebBrowserView上以编程方式禁用Quicktype Keyboard

时间:2015-08-06 11:39:47

标签: ios cordova contenteditable

我正在为iOS开发PhoneGap应用程序,我需要在键盘上禁用自动预测文本。

我为UITextView找到了很多像这样的解决方案:

Disable iOS8 Quicktype Keyboard programmatically on UITextView

ios8 xcode how to remove QuickType on UIKeyboard ( auto complete / auto suggest )

...但PhoneGap应用内有UIWebBrowserView

我也知道用于禁用自动预测的html属性。它们仅适用于常规html输入,但我contenteditable上有UIWebBrowserView元素,这是文本编辑器的可编辑区域(在我的例子中是CKEditor)。

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

那么,有没有办法在iOS上以编程方式禁用contenteditable元素的自动预测功能?

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

我最近在托管UIWebView的本机应用程序(而非PhoneGap)中遇到了此问题,但无法通过更改HTML来解决此问题。我建议向Apple提交一个错误。

我能够强制键盘显示无法使用相当复杂的方案的QuickType,我肯定不会通过App Store指南:

1)留意UIKeyboardWillShowNotification次通知

2)当键盘出现时,找到第一个响应者 - 这将是UIWebView

内的一些视图

3)动态子类化此视图以提供textInputTraits方法的替代实现(返回符合UITextInputTraits的对象)。将此返回对象的autocorrectionType设置为UITextAutocorrectionTypeNo

4)在第一个响应者视图上调用reloadInputViews - 两次。

我意识到所有这些都不可能帮助您或解决您的具体问题,但也许它会帮助某人。

答案 1 :(得分:1)

我发现的唯一方法是使用私有API:

UIWebBrowserView *browserView = _myBrowserView;

NSString *spellChecking =@"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的评论。

答案 2 :(得分:0)

方法调整可能会有所帮助。

1.创建catogory:UITextView + CloseQuickType.h&amp;的UITextView + CloseQuickType.m

2.下载jrswizzle at 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.运行申请。

PS:我试过了

[[UITextView appearance] setAutocorrectionType:UITextAutocorrectionTypeNo];

更改默认设置但在Xcode7,ios9中崩溃。