ios - 每次笔划更改用户文本字段输入并获取更改的消息

标签 ios uitextfield

我想在他(或她)键入时将用户输入格式化为文本字段。例如,当在地址的“州”字段中输入字母时,我想将输入限制为两个大写字母...

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

    NSString *letters = [[afterInput componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""];
    textField.text = [[letters substringToIndex:MIN(2, letters.length)] uppercaseString];
    return NO;
}

我发现我需要返回 NO,否则我会将原始输入添加到我的格式化更改中。

这在用户键入时成功地进行了格式化,但我还需要将文本字段的每一次更改都告知委托(delegate)人。为此,我在初始化期间添加了(感谢 SO)这一行:

[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

这就是问题所在:textFieldDidChange 在每次更改时都会被调用,但只有当我对 shouldChangeCharactersInRange 回答 YES 时才会调用。我需要能够回答“否”(这样我就可以在打字时进行格式化)但仍会收到已更改的消息。

1) 我应该怎么做? 2)我是否犯了更大的错误,是否有更好的方法来格式化并从文本字段中获取所有正确的消息?谢谢!

最佳答案

这是一种方法...

不是为 UIControlEventEditingChanged 实现处理程序,而是处理输入(与您已经在做的差不多)然后调用您自己的“文本已更改”方法,但如果文本实际上改变了:

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

    // get the current text
    NSString *origText = textField.text;

    // "apply" the user's input
    NSString *afterInput = [origText stringByReplacingCharactersInRange:range withString:string];

    // filter non-Alpha
    NSString *letters = [[afterInput componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""];

    // upper-case the result
    NSString *uString = [[letters substringToIndex:MIN(2, letters.length)] uppercaseString];

    // if the resulting upper-cased string is NOT the same as what was there to begin with...
    if (![origText isEqualToString:uString]) {
        // update the text in the text field
        textField.text = uString;
        // call your own "text changed" method
        [self myTextChangedMethod:textField];
    }

    return NO;
}

- (void)myTextChangedMethod:(UITextField *)tf {
    // do what you want here...
    NSLog(@"%@", tf.text);
}

关于ios - 每次笔划更改用户文本字段输入并获取更改的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48306491/

相关文章:

ios - 如何在 Swift 中使用正则表达式将匹配表达式替换为模板字符串而不是纯文本

ios - Swift 中的台风 defaultAssembly()

iphone - 选择模拟器后,如何在 XCode 中自动启用#define?

ios - NSSortDescriptor 和 NSFetchedResultsController 的自定义选择器

ios - UIPickerView 作为 inputView 未在 iPad 上隐藏

swift - UIView 中的自定义 View 的触摸检测问题,而不是 UIScrollView

ios - 从返回 String 或 Double 的 API 获取

ios - 5 秒后调用一个方法。没有 NSTimer

iphone - 光标出现在自定义的 UITextField 背景图像之前

objective-c - UITextField 中的彩色子串