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

Posted

技术标签:

【中文标题】iOS 在 UIWebBrowserView 上以编程方式禁用 Quicktype 键盘【英文标题】:iOS disable Quicktype Keyboard programmatically on UIWebBrowserView 【发布时间】:2015-08-06 11:39:46 【问题描述】:

我正在为 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 输入,但我的 UIWebBrowserView 上有 contenteditable 元素,这是文本编辑器的可编辑区域(在我的情况下为 CKEditor)。

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

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

非常感谢任何帮助!

【问题讨论】:

你找到解决办法了吗? 在 contenteditable 元素上不可能 @Robin 尚未找到解决方案。但由于此功能对于应用程序至关重要,因此我们使用复杂的解决方法 - 创建本机文本编辑器(适用于 iOS 的 RichTextEditor)并将其绘制在 WebView 上方。当应用程序的某些部分应该高于原生编辑器(例如模式对话框)时,我们将原生编辑器替换为填充原生编辑器内容的div 元素。 【参考方案1】:

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

我能够通过一个相当复杂的方案强制键盘显示 sans QuickType,我确信它不会通过 App Store 指南:

1) 留意UIKeyboardWillShowNotification 通知

2) 当键盘出现时,找到第一响应者 - 这将是 UIWebView 内的一些视图

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

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

我知道这一切不太可能帮助您或解决您的具体问题,但也许会对某人有所帮助。

【讨论】:

【参考方案2】:

我发现的唯一方法是使用私有 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 的审核。

【讨论】:

【参考方案3】:

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

1.创建分类:UITextView+CloseQuickType.h & 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 中崩溃。

【讨论】:

以上是关于iOS 在 UIWebBrowserView 上以编程方式禁用 Quicktype 键盘的主要内容,如果未能解决你的问题,请参考以下文章

如何在IOS程序上以后台模式关闭音乐?

在 iOS 13 上以编程方式滚动 SwiftUI ScrollView

在 iOS 上以编程方式向按钮添加操作

在 iOS 7 上以编程方式安装 .mobileconfig 文件

在 iOS 11 上以编程方式滚动 UISearchController 的搜索栏不会消失

如何在 iOS 上以编程方式创建选项卡视图