iOS8代理方法中的nil对象 - 自定义键盘

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
我需要自己实现什么吗?


现在在beta 6中,任何对textInput的调用都会导致键盘崩溃。 - bauerMusic
@bauerMusic 你是在调用 self.textDocumentProxy 吗?你指的是哪个 textInput? - nurnachman
@bauerMusic 我猜它崩溃是因为它是nil,对吧? - nurnachman
@nurne 你能否修改你的代码让它工作起来了吗?我上周为你添加了一个答案。 - Drakes
你能添加完整的InputViewController代码吗? - DrCachetes
显示剩余4条评论
1个回答

2

好问题。但看起来 UITextInputDelegate 不是一个你要实现的协议。

从苹果文档中标题为 Lower Level Text-Handling Technologies 的部分中得知:

当文本视图中发生由外部原因引起的更改时——也就是说,它们并不是由文本输入系统调用引起的——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];
    }
}

这里有更多示例代码

请注意保留HTML标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接