iOS8委托方法中的nil对象 - 自定义键盘

时间:2014-07-06 13:22:42

标签: ios ios8 delegates ios-app-extension

我正在构建自定义键盘 我在InputViewController中实施了以下委托方法 但我总是得到_textInput = nil_

- (void)textWillChange:(id<UITextInput>)textInput
- (void)textDidChange:(id<UITextInput>)textInput
- (void) selectionWillChange:(id<UITextInput>)textInput
- (void) selectionDidChange:(id<UITextInput>)textInput

有人知道怎么解决吗?
nil是有原因的吗? 我需要自己实施一些东西吗?

1 个答案:

答案 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