【问题标题】:UITextInputDelegate methods not functioning correctlyUITextInputDelegate 方法无法正常工作
【发布时间】:2014-09-29 06:10:29
【问题描述】:

我现在正在开发 iOS 8 自定义键盘扩展,使用 UITextInputDelegate 方法存在一些问题。

这样做对吗:selectionWillChange:selectionDidChange: 方法应该在用户长按输入区域时调用?并且当文本真正发生变化时应该调用 textWillChange:textDidChange: 方法?

实际上,我观察到的是,当我在文本输入区域更改选择时,会调用 textWillChange: 和 textDidChange: ,而我不知道在什么条件下调用了其他两个方法。如果有人知道这些委托方法的用法,请告诉我。

【问题讨论】:

  • 对此也很恼火。我无法接到 selectionWillChange selectionDidChange 的电话。从(适度的)文档中不清楚何时应该调用它。 "when the selection has changed" is not exactly specific.我尝试移动光标、选择、移动选择、复制、粘贴。我错过了什么吗??
  • 完全同意。我读了一百遍文档,仍然找不到任何线索。
  • @bauerMusic 为您提供了一个可行的解决方案,当然它不是您想要的方法。 stackoverflow.com/a/25225419/2057171
  • 错误。仍然无法正常工作,但幸运的是解决方法

标签: ios8 ios-app-extension custom-keyboard


【解决方案1】:

这对我也不起作用...我目前正在做的只是使用textWillChangetextDidChange,正如您所提到的,当您更改选择时,它们会被调用...(它们被称为 之前之后

然后比较:
self.textDocumentProxy.documentContextBeforeInput
self.textDocumentProxy.documentContextAfterInput

来自之前 (textWillChange) 到 AFTER (textDidChange) 以查看选择范围或长度是否发生了变化。


类似这样的东西(当然,在你的 .h 文件中设置下面的 4 个 NSStrings...还没有测试过这个确切的 sn-p,因为我刚刚在 SO.com 上从头开始编写它,但我确定原理如果我犯了任何错误,则可以使用)

- (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!");
    }   
}

【讨论】:

  • 我一周前向 Apple 提交了一份错误报告,并从他们那里收到了我最近发送的“测试用例”请求。要么这不能正常工作,要么我误解了代表的功能,在这种情况下,文档应该更清晰、更具体。
【解决方案2】:

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

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

在我的情况下有效的修复是重置函数中的 inputDelegate:

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

通过以下行:

[myUITextField setInputDelegate:self];

self 实现了 UITextInputDelegate 协议。

【讨论】:

  • 这个答案不清楚,而且似乎是错误的。问题是如何在 iOS8 键盘扩展中激活此协议,该扩展仅适用于有限的 UITextInputDelegate 方法。我找不到任何可用于设置输入委托的 UITextField,或任何覆盖 shouldChangeCharactersinRange 的方法。
  • 我同意兰迪希尔的观点。可能在平行宇宙中,有 UITextInput 委托可用于 op 正在谈论的这个虚构的 UITextfield,遗憾的是不在这个宇宙中。
猜你喜欢
  • 2019-06-02
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
相关资源
最近更新 更多