40

我正在构建一个自定义键盘,并在我的InputViewController.
但我总是得到_textInput = nil_

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

有人知道如何解决吗?
这是nil有原因的吗?
我需要自己实现一些东西吗?

4

1 回答 1

2

好问题。但这似乎UITextInputDelegate不是实现的协议。

来自标题为Lower Level Text-Handling Technologies 的Apple Docs :

当文本视图由于外部原因而发生更改时——也就是说,它们不是由来自文本输入系统的调用引起的——UITextInput 对象应该发送textWillChange:textDidChange:selectionWillChange:selectionDidChange:消息到输入委托(它持有对它的引用)。例如,当用户点击文本视图并设置选定文本的范围以将插入点置于手指下方时,您将selectionWillChange: 在更改选定范围之前发送,并selectionDidChange: 在更改范围之后发送。

并且来自 UITextInputDelegate 上的文档

UIKit 提供了一个私有文本输入委托,它在运行时将其分配给类采用 UITextInput 协议的对象的 inputDelegate 属性。

上面的含义是我们没有实现这些委托方法;我们使用它们来通知inputDelegate您已通过键盘输入以外的方式更改了文本或选择。

以下是说明这一点的示例方法:

- (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

于 2015-04-11T10:19:39.290 回答