自定义 UITextInput 实现不显示多阶段输入建议

sim*_*eon 5 cocoa-touch uikeyboard ios uitextinput uitextinputtraits

我有一个基于自定义UITextInput的文本编辑器。除了通过标记文本进行多阶段输入之外,它工作得很好。

我的标记区域渲染正确,并且插入了标记文本,但键盘上方的候选列表是空白的。

例如,下面是日语(假名)键盘,显示了有关标准 UITextView 的建议:

默认标记文本

这是我的自定义编辑器,显示相同的标记文本:

在此输入图像描述

我花了几天时间调试这个问题,发现原因是该方法UIKeyboardImpl返回私有类NOdelegateSupportsCorrectionUI

如果我在类别中覆盖此方法UIKeyboardImpl并返回YES,则多级输入建议会正确显示在我的文本编辑器中。然而,这并没有解决问题的根本原因(而且它不可用)。

我还仔细研究了 Apple 的 SimpleTextInput 示例代码。这实现了一个基本的核心文本编辑器。SimpleTextInput 正确显示多级输入建议,但是我似乎找不到其实现中的任何差异,UITextInput导致它工作而我的崩溃。

(事实上​​,我无法“破坏”SimpleTextInput 示例显示多阶段输入的能力。这让我认为我对实现的关注UITextInput是错误的。而且这完全是另一回事。)

sim*_*eon 4

好吧,这有点尴尬。我现在才注意到:

@property(nonatomic, readonly) UIView *textInputView
Run Code Online (Sandbox Code Playgroud)

讨论

该视图既绘制文本,又为本协议中的所有几何值提供坐标系。(这通常是 UITextInput 采用类的实例。)如果未实现此属性,则选择响应程序链中的第一个视图。

在文档中。

我愚蠢地@synthesize修改了这个属性并忘记了它,这意味着我的 UITextInput 实现返回了一个nil textInputView. 只需将其保留为未实现,即可从响应者链中选择第一个视图,这为文本系统提供了必要的坐标系来处理自动更正和多级输入建议。

这是经过三天的调试之后的结果。现在我觉得自己很愚蠢。