Ios 如何强制用户停止在UITextField中键入,但允许退格

Ios 如何强制用户停止在UITextField中键入,但允许退格,ios,objective-c,iphone,uitextfield,Ios,Objective C,Iphone,Uitextfield,我有一个UITextField,我的用户用它来键入标记。我需要能够在一个非常特定的时间阻止我的用户继续键入默认情况下带有UITextFields的键盘。然而,我需要我的用户仍然被允许点击iOS键盘上的退格按钮,以便他们可以尝试键入适合的单词 要记住两件非常重要的事情: UITextField不应由于最大字符数而冻结,因为我正在根据添加到标记屏幕的UIView确定何时冻结textField 用户仍然应该能够退格 键盘不应该被丢弃 文本字段不应被禁用 我已经尝试设置textField.enabled

我有一个UITextField,我的用户用它来键入标记。我需要能够在一个非常特定的时间阻止我的用户继续键入默认情况下带有UITextFields的键盘。然而,我需要我的用户仍然被允许点击iOS键盘上的退格按钮,以便他们可以尝试键入适合的单词

要记住两件非常重要的事情:

UITextField不应由于最大字符数而冻结,因为我正在根据添加到标记屏幕的UIView确定何时冻结textField 用户仍然应该能够退格 键盘不应该被丢弃 文本字段不应被禁用
我已经尝试设置textField.enabled=NO,但我需要再次能够使用textField,我只需要冻结键入并强制用户退格,不允许向textField添加andy字符。

您可以尝试下面的方法

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

  NSString *text = [textField.text stringByReplacingCharactersInRange:range withString: string];

  if([text length] > MAX_LENGTH)
       return NO;
  else 
       return YES;

 }
编辑1: 要调用此委托方法,请设置textfield的委托。 在这种情况下,您可以将其用作

yourTextField.delegate = self;

在您的视图中,将出现/视图显示。

您可以尝试以下方法

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

  NSString *text = [textField.text stringByReplacingCharactersInRange:range withString: string];

  if([text length] > MAX_LENGTH)
       return NO;
  else 
       return YES;

 }
编辑1: 要调用此委托方法,请设置textfield的委托。 在这种情况下,您可以将其用作

yourTextField.delegate = self;

在您的视图中,将出现/ViewDidDisplay。

尝试此操作,即使文本字段中预先填充了超过最大长度的文本,返回空间也会起作用

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range
replacementString: (NSString*) string {
  NSString *text = [textField.text stringByReplacingCharactersInRange:range withString: string];

NSString *text = [textField.text stringByReplacingCharactersInRange:range withString: string];
if([text length] > MAX_LENGTH && string.length>0)
    return NO;
else
    return YES;
}

尝试此操作,即使文本字段预先填充了超过最大长度的文本,后台空间也会起作用

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range
replacementString: (NSString*) string {
  NSString *text = [textField.text stringByReplacingCharactersInRange:range withString: string];

NSString *text = [textField.text stringByReplacingCharactersInRange:range withString: string];
if([text length] > MAX_LENGTH && string.length>0)
    return NO;
else
    return YES;
}
试试这个

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    if(textField == self.yourTextField)
    {
        return newLength <= CHARACTER_LIMIT;
    }
    else
    {
        return YES;
    }
}
试试这个

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    if(textField == self.yourTextField)
    {
        return newLength <= CHARACTER_LIMIT;
    }
    else
    {
        return YES;
    }
}

在SubdCuxEngCurrimeString中:方法检查参数字符串长度,如果它是0,而不是可以考虑它作为后退空间,那么返回“是”,否则它是一个字符返回No.No谢谢。我想这正是我想要的行为所需要的:改变参数范围:如果参数是0,那么检查参数字符串长度,你可以把它看作是返回空间,所以返回是的,否则它是一个字符返回No谢谢。我想这正是我想要的行为所需要的。别忘了给你的文本字段;如果预填充的文本字段长度超过最大长度,则使用上述代码无法删除或删除文本backspace@ismail:不,不是这样的,当您在达到最大长度后返回间距时,新文本长度将变为最大长度-1,这就是为什么我们在方法的第一行将textField.text替换为editbackspace。@当然,如果我们正在键入,则设置text=@是可以的。在这种情况下,如果textField中的数据大于最大长度,则代码不会删除beyond字符。别忘了给textField.delegate=self;如果预填充的文本字段长度超过最大长度,则使用上述代码无法删除或删除文本backspace@ismail:不,不是这样的,当您在达到最大长度后返回间距时,新文本长度将变为最大长度-1,这就是为什么我们在方法的第一行将textField.text替换为editbackspace。@如果我们正在键入,那么设置text=@就可以了。在这种情况下,如果textField中的数据大于MAX_长度,那么代码将无法删除超出的字符