每次笔划更改用户文本字段输入并获取更改的消息
Change user text field input each stroke and also get changed message
我想在他(或她)键入时将用户输入格式化为文本字段。例如,当在地址的 "state" 字段中输入字母时,我想将输入限制为两个大写字母...
- (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;
}
我发现我需要 return NO
,否则我会将原始输入添加到我的格式化更改中。
这会在用户键入时成功格式化,但我还需要将文本字段的每次更改都告知委托人。为此,我在初始化期间添加了(感谢 SO)这一行:
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
问题是:textFieldDidChange
在每次更改时都会被调用,但只有当我回答 YES
到 shouldChangeCharactersInRange
时才会调用。我需要能够回答“否”(这样我就可以在打字时格式化)但仍然会收到更改后的消息。
1) 我应该怎么做? 2)我是否犯了更大的错误,是否有更好的方法来格式化并从文本字段中获取所有正确的消息?谢谢!
这是一种方法...
不是为 UIControlEventEditingChanged
实现处理程序,而是处理输入(与您已经在做的差不多)然后调用您自己的 "text changed" 方法,但 仅 如果文本实际更改:
- (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);
}
我想在他(或她)键入时将用户输入格式化为文本字段。例如,当在地址的 "state" 字段中输入字母时,我想将输入限制为两个大写字母...
- (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;
}
我发现我需要 return NO
,否则我会将原始输入添加到我的格式化更改中。
这会在用户键入时成功格式化,但我还需要将文本字段的每次更改都告知委托人。为此,我在初始化期间添加了(感谢 SO)这一行:
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
问题是:textFieldDidChange
在每次更改时都会被调用,但只有当我回答 YES
到 shouldChangeCharactersInRange
时才会调用。我需要能够回答“否”(这样我就可以在打字时格式化)但仍然会收到更改后的消息。
1) 我应该怎么做? 2)我是否犯了更大的错误,是否有更好的方法来格式化并从文本字段中获取所有正确的消息?谢谢!
这是一种方法...
不是为 UIControlEventEditingChanged
实现处理程序,而是处理输入(与您已经在做的差不多)然后调用您自己的 "text changed" 方法,但 仅 如果文本实际更改:
- (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);
}