我正在构建自定义键盘
我在InputViewController
中实施了以下委托方法
但我总是得到_textInput = nil_
- (void)textWillChange:(id<UITextInput>)textInput
- (void)textDidChange:(id<UITextInput>)textInput
- (void) selectionWillChange:(id<UITextInput>)textInput
- (void) selectionDidChange:(id<UITextInput>)textInput
有人知道怎么解决吗?
是nil
是有原因的吗?
我需要自己实施一些东西吗?
答案 0 :(得分:2)
好问题。但似乎UITextInputDelegate
不是您实施的协议。
来自标题为Lower Level Text-Handling Technologies的Apple文档:
由于外部原因在文本视图中发生更改时 - 也就是说, 它们不是由来自文本输入系统的调用引起的 -
UITextInput
对象应发送textWillChange:
,textDidChange:
, 输入的selectionWillChange:
和selectionDidChange:
条消息 代表(它持有一个参考)。例如,当用户点击时 文本视图,您可以设置所选文本的范围以放置 手指下方的插入点,您会发送selectionWillChange:
在更改所选范围之前,您发送selectionDidChange:
更改范围后。
来自UITextInputDelegate上的docs:
UIKit提供了一个私有文本输入委托,它分配给它 运行时到其类采用的对象的inputDelegate属性 UITextInput协议。
上述含义是我们不实施这些委托方法;我们使用它们通过除键盘输入以外的方式通知inputDelegate
您已更改文本或选择。
这是一个example方法,用于说明这一点:
- (void)delete:(id)sender;
{
if (selection && ![selection isEmpty]) {
[inputDelegate textWillChange:self];
[inputDelegate selectionWillChange:self];
[self replaceRange:selection withText:@""];
[inputDelegate selectionDidChange:self];
[inputDelegate textDidChange:self];
}
}
示例代码包含更多示例here。