插入多个字符时关闭文本字段

Posted

技术标签:

【中文标题】插入多个字符时关闭文本字段【英文标题】:Close text field when a number of characters is inserted 【发布时间】:2013-09-13 10:23:59 【问题描述】:

我有一个要在其中插入电话号码的文本字段。问题是我使用数字键盘并且没有任何输入键并且我没有那个键我不知道如何关闭文本字段。

有什么方法可以检查文本字段中有多少个数字 os 字符并在有 X 个字符时关闭数字键盘?

对不起我的英语和菜鸟问题,但我只是从 ObjC 开始。

谢谢*

对不起各位,我忘了告诉你们我已经试过了:

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

    if (textField.text.length== 9) 
         [textField resignFirstResponder];

    
    return YES;

【问题讨论】:

这不起作用的原因是您在应用修改之前检查了长度。您需要获取文本、应用更改并检查结果的长度。详情请见this answer。 【参考方案1】:

是的,我认为你有两个选择,你可以:

A.检查委托方法 shouldChangeTextInRange 中返回的字符数,然后如果达到限制,请辞去第一响应者(当您辞去第一响应者时,键盘会关闭,

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

    if ( textView.text.length + (text.length - range.length) == 10) //or whatever value you like
    
        [textField resignFirstResponder];
     

或乙:

覆盖视图的 touchesEnded 方法并调用 resignFirstResponder,这样当用户触摸 textField 之外的视图时,键盘就会关闭。 - 这就是我在我的应用中所做的。

像这样:

只需将此方法添加到您的viewController中,当视图中的触摸结束时会自动调用该方法,在此方法中您只需resignFirstResponder,键盘就会消失。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    [textField resignFirstResponder];

我认为最好在 touchesEnded 中执行此操作而不是在开始时执行此操作,当您将手指从视图中抬起而不是最初触摸它时让键盘消失“感觉”更好。

【讨论】:

那个 B 选项听起来不错,你有任何示例代码可以检查吗?谢谢!【参考方案2】:

我发现 resignFirstResponder 不包括最后输入的字符。我不得不这样做,

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

    DLog(@"Existing: %@, string: %@, range:(%lu, %lu)", textField.text, string, (unsigned long)range.location, (unsigned long)range.length);

        if (textField == field2.textField) 

            if ( textField.text.length + (string.length - range.length) == kMyNumberLength) // e.g. 10
            
                textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];
                [textField resignFirstResponder];
            

            if (textField.text.length + string.length - range.length > kMyNumberLength) 
                return NO;
             else 
                return YES;
            
               
    return YES;

【讨论】:

【参考方案3】:

斯威夫特

当达到最大字符数时,将新字符添加到textfield 中的当前文本中,然后关闭键盘

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 

    let maxLength = 5
    let currentString: NSString = textField.text! as NSString
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString

    if newString.length == maxLength 
        textField.text = textField.text! + string
        textField.resignFirstResponder()
    

    return newString.length <= maxLength

【讨论】:

【参考方案4】:

每次用户添加一个数字,你的文本字段的委托都会通过这个方法得到通知:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    NSUInteger length = [[textField text] length] - range.length + string.length;
    if (length == ...) ...

您可以设置您的委托,以观察您的文本字段修改内容的长度,并在达到预期长度时关闭该字段。

但是,这很有可能让您的用户非常沮丧:他们会时不时地输入最后一个字符,并且该字段将关闭他们,而不是让他们纠正问题。更好的方法是dismiss the pad when users tap away from your text field,它可以让最终用户控制正在发生的事情:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    [textField resignFirstResponder];

【讨论】:

感谢您花时间回答我的问题 :) 周末愉快!【参考方案5】:

您可以只放置一个带有完成的工具栏,单击该按钮也可以隐藏键盘和工具栏。

-(IBAction)doneButtonClicked:(id)sender
[yourTextField resignFirstResponder];
[toolBar setHidden:YES];

或者你可以使用this自定义工具

【讨论】:

【参考方案6】:

使用这个 textfield 委托方法找出 textField.text 的长度

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

   int textLength = [textField.text length] + 1;
   return YES;

【讨论】:

感谢@Anuj,但 John Woods 刚刚回答了我的问题!

以上是关于插入多个字符时关闭文本字段的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 委托返回多个文本字段

单击按钮时将文本插入另一个页面上的元素[关闭]

仅使用键盘从多个文本字段中获取字符串

关闭具有多个文本字段的第一响应者/键盘

按下返回键时如何通过多个文本字段输入进行选项卡?

在文本字段中插入一个字符后启用完成按钮: textFieldDidEndEditing: 或 textFieldShouldBeginEditing: 或?