【问题标题】:How to limit text in textfield when entered text through speech通过语音输入文本时如何限制文本字段中的文本
【发布时间】:2019-05-16 18:47:22
【问题描述】:

我有 3 个文本字段,并且我使用 UITextFeildDelegate 方法将每个文本字段的字符限制限制为 50,它工作正常。现在,当我尝试通过语音而不是键盘输入文本时,文本字段似乎可以接受超过 50 个字符,并且有时整个文本会在语音输入完成后消失。

这是我的委托方法shouldChangeCharactersInRange

if(textField==self.optionATextField || textField==self.optionBTextField ||textField==self.optionCTextField) {
    if(range.length + range.location > textField.text.length) {
        return NO;
    }
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 50;
}

有什么办法吗?我是否需要实现任何其他方法才能使语音输入正常工作。

希望您了解问题所在。 提前致谢

【问题讨论】:

  • 如果输入的文本超过 50 个字符,您是否希望将文本字段截断为 50 个字符?顺便说一句 - 如果用户粘贴文本以及使用语音,您是否有同样的需求?
  • @rmaddy 我想在达到 50 个字符时限制文本输入...不截断,用于粘贴和语音
  • 假设有 40 个字符,用户粘贴了 20 个以上。您是要忽略整个 20 还是让前 10 变成 50?
  • 我希望前 10 个达到 50 个
  • 好的,这就是我的回答。

标签: ios objective-c uitextfield


【解决方案1】:

shouldChangeCharactersInRange ,当用户使用听写(语音转文本)功能时,不会调用覆盖方法。 你可以做的是,(这个例子是在C#(Xamarin iOS)上)

1.使用:

textField.EditingChanged += textField_EditingChanged;

2.在下面的方法中实现以下, maxLength:searchBar 文本字段的最大长度

private void textField_EditingChanged(object sender, EventArgs e)
{
   var textField = sender as UITextField;
   var maxLengthSubstractionValue = textField.Text.Length.CompareTo(maxLength);
      if(maxLengthSubstractionValue == 1)
         {
           textField.Text =  textField.Text.Substring(0, Math.Min(maxLength, textField.Text.Length));
         }
 }

【讨论】:

    【解决方案2】:

    要实现该功能,您必须使用textViewDidChange 委托方法。

    - (void)textViewDidChange:(UITextView *)textView { 
        if (textView.text.length > kMaxCharAllowed) {
            textView.text = [textView.text substringToIndex:kMaxCharAllowed];
        }
    }
    

    只要文本字段字符串发生变化,就会调用此方法。如果文本比期望的长,我们用期望长度的字符串替换文本。

    除此之外,使用- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 方法来处理键盘输入。

    【讨论】:

      【解决方案3】:

      假设您希望输入的文本被截断为最多 50 个字符,而不管输入方法如何,您可以执行以下操作:

      - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
          if(textField==self.optionATextField || textField==self.optionBTextField ||textField==self.optionCTextField) {
              NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string];
              if (newText.length < 50) {
                  // Text length is still OK, let it through
                  return YES;
              } else {
                  // The new text is too long - truncate and set the shorter value
                  newText = [newText substringToIndex:50];
                  textField.text = newText;
      
                  return NO;
              }
          } else {
              return YES; // do whatever you need here
          }
      }
      

      【讨论】:

      • 我尝试了代码...但它似乎在通过语音输入时接受超过 50 个字符。
      • 语音输入时是否调用shouldChangeCharactersInRange?设置一个断点,看看会发生什么。
      • 'shouldChangeCharactersInRange` 仅在单击完成按钮时调用,而不是在通过语音输入文本时调用。
      • 我刚刚在我的应用中做了一个测试。使用听写时,文本似乎是在您说话时输入的。当您点击完成时将调用shouldChangeCharactersInRange。此时文本将被截断。你试过了吗?
      • 是的,我的答案中的代码。点击完成后,文本将被截断为 50 个字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多