UITextInputDelegate 方法无法正常运行

16

我正在开发iOS 8的自定义键盘扩展,但在使用UITextInputDelegate方法时遇到了一些问题。

这样做是否正确:selectionWillChange:selectionDidChange: 方法应该在用户长按输入区域时被调用吗?而textWillChange:textDidChange: 方法应该在文本实际变化时被调用吗?

实际上,我观察到的是,当我在文本输入区域更改选择时,textWillChange:和textDidChange:被调用,而我不知道另外两个方法在什么情况下会被调用。如果有人了解这些代理方法的使用,请告诉我。


我也为此苦恼了很久。我无法调用selectionWillChangeselectionDidChange方法。从(简陋的)文档中并不清楚它们应该在何时被调用。"当选择已更改"并不是非常具体。我尝试移动光标、选择、移动选择、复制、粘贴等操作。难道我错过了什么吗? - bauerMusic
完全同意。我已经阅读了文档一百遍,仍然无法找到任何线索。 - Tack-Gyu Lee
@bauerMusic 给你提供了一个可行的解决方案,尽管它不是你想要的方法。https://dev59.com/nV8e5IYBdhLWcg3w_-dM#25225419 - Albert Renshaw
错误。仍然无法工作,但幸运的是有一些解决方法。 - Will Von Ullrich
2个回答

5
我也遇到了同样的问题... 目前我正在使用 textWillChangetextDidChange,它们会在您更改选择时被调用,正如您所提到的,它们会在之前之后被调用。

然后将以下内容进行比较:
self.textDocumentProxy.documentContextBeforeInput
self.textDocumentProxy.documentContextAfterInput

之前(textWillChange)到之后(textDidChange),看是否选择范围或长度发生了任何变化。
像这样(当然,在您的.h文件中设置下面的4个NSStrings... 我现在从头开始写这个代码片段,还没有测试过这个确切的片段,但我确定原理是正确的,如果我犯了任何错误)。
- (void)textWillChange:(id<UITextInput>)textInput {
    beforeStringOfTextBehindCursor = self.textDocumentProxy.documentContextBeforeInput;
    beforeStringOfTextAfterCursor = self.textDocumentProxy.documentContextAfterInput;
}

- (void)textDidChange:(id<UITextInput>)textInput {
    afterStringOfTextBehindCursor = self.textDocumentProxy.documentContextBeforeInput;
    afterStringOfTextAfterCursor = self.textDocumentProxy.documentContextAfterInput;

    BOOL didSelectionChange = NO;

    if (![beforeStringOfTextBehindCursor isEqualToString:afterStringOfTextBehindCursor]) {
        didSelectionChange = YES;
    }

    if (![beforeStringOfTextAfterCursor isEqualToString:afterStringOfTextAfterCursor]) {
        didSelectionChange = YES;
    }

    if (didSelectionChange) {
        NSLog(@"Selection Changed!");
    }   
}

我一周前向苹果提交了一个错误报告,并收到了他们的“测试用例”请求,我最近已经发送了。要么这个功能没有按照应该的方式工作,要么我误解了委托的功能,如果是后者,那么文档应该更清晰、更具体。 - bauerMusic

-1

我在使用UITextInput协议中指定的函数时遇到了同样的问题,这些函数没有被调用。据我所知,原因是inputDelegate在运行时设置。根据iOS文档:

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

在我的情况下有效的解决方法是在函数中重置inputDelegate:

textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
     replacementString:(NSString *)string

通过以下代码行:
[myUITextField setInputDelegate:self];

self 实现了 UITextInputDelegate 协议。


1
这个答案不够清晰,而且似乎是错误的。问题是如何在仅使用有限的UITextInputDelegate方法的iOS8键盘扩展中激活此协议。我找不到任何可用于设置输入委托的UITextField,也找不到覆盖shouldChangeCharactersinRange的任何方法。 - SafeFastExpressive
我同意Randy Hill的观点。也许在另一个平行宇宙中,这个虚构的UITextfield有可用的UITextInput代理,但遗憾的是在这个宇宙中没有。 - ThefunkyCoder

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