在自定义键盘扩展中检测输入对象视图类型

Posted

技术标签:

【中文标题】在自定义键盘扩展中检测输入对象视图类型【英文标题】:Detect input object view type in custom keyboard extension 【发布时间】:2014-08-19 11:45:15 【问题描述】:

我正在使用 ios 8 中的应用扩展开发自定义键盘。

我有一个返回键,按下时我想检查输入对象是否为UITextView,然后使用以下代码移至下一行:[self.textDocumentProxy insertText:@"\n"];。如果输入对象是UITextField,则以这种方式关闭键盘:[self dismissKeyboard];

类似这样的:

- (void) returnKeyPressed

    if (inputObjectIsTextView)
    
        [self.textDocumentProxy insertText:@"\n"];
    
    else if (inputObjectIsTextField)
    
        [self dismissKeyboard];
    

问题是:如何检测当前正在编辑哪种输入视图?

【问题讨论】:

【参考方案1】:

无需检测输入视图是UITextFieldUITextView 即可进入新行

如“自定义键盘的 API 快速入门”标题下的 here 所述

[self.textDocumentProxy insertText:@"\n"];   // In a text view, inserts a newline character at the insertion point

也就是说不需要检测,你可以这样做

- (void) returnKeyPressed

    [self.textDocumentProxy insertText:@"\n"];

如果 inputView 是 UITextView,这将执行,如果输入类型是 UITextField,则不执行。

我已经创建了一个键盘并在此处发布之前对其进行了测试。

【讨论】:

【参考方案2】:

你不能这样做,如果你查看文档,你会发现没有用于检测键盘扩展文本输入对象的公共 API。

来自文档。 因为自定义键盘只能在其UIInputViewController 对象的主视图中绘制,所以它不能选择文本。文本选择由使用键盘的应用程序控制。如果该应用程序提供了编辑菜单界面(例如用于剪切、复制和粘贴),则键盘无法访问它

我认为这也意味着您无法从使用键盘扩展的应用程序访问文本输入对象。

【讨论】:

【参考方案3】:

尝试这样的事情,将活动视图的引用作为'inputViewObject',然后尝试

- (void) returnKeyPressed


    if (inputViewObject.class==[UITextView class])
    
        [self.textDocumentProxy insertText:@"\n"];
    
    else if (inputViewObject.class==[UITextField class])
    
        [self dismissKeyboard];
    

希望对你有帮助。

【讨论】:

对不起,我不太明白你的建议。您能否详细解释一下?谢谢。

以上是关于在自定义键盘扩展中检测输入对象视图类型的主要内容,如果未能解决你的问题,请参考以下文章

ios) 如何在自定义键盘上方创建建议视图

EditText.SetText() 在自定义适配器中更改我的软键盘输入类型

在自定义键盘扩展中播放标准 iOS 键盘点击声音

UIScreenEdgePanGestureRecognizer 在自定义键盘扩展中不起作用

在键盘应用程序扩展中使用 UITextField

在自定义容器视图控制器中调用 endEditing 会隐藏键盘但不会更改键盘响应器