123*_*123 6 objective-c hyphen ios
我正在学习iOS开发,并且很难搞清楚控件的各种事件.对于测试,我有一个UITextField,用户打算输入以下格式的字符串:XXXX-XXXX-XXXX-XXXX
我希望能够检查每个条目后字段中的文本有多长,并查看是否需要在其后附加连字符.我为此设置了我的IBAction功能但是当我将它分配给"Value Changed"事件时它什么也没做,当我在"Editing Did End"上设置它时它工作正常,但只有在用户退出时才会调用控制.
编辑:只是要添加,"编辑已更改"事件也会导致崩溃.我假设这是一个堆栈溢出或文本设置再次调用事件处理程序的东西.
简而言之,有没有办法在用户每次在UITextField中输入字符时设置事件处理程序?
din*_*sky 35
请注意,之前的答案严重不足.天堂禁止用户输入错误的数字,敢于尝试删除它!公平地说,海报注意到代码可能无法完美运行.但是,它甚至不会编译,所以买家当心过滤器应该已经很高了.如果你修复了编译错误并尝试了代码,你会发现你很容易得到与海报规定格式不符的输入.
这是我用于将文本字段限制为格式为123-456-7890的电话号码的解决方案.调整其他数字格式是微不足道的.注意使用传递的NSRange.而且,即使使用数字虚拟键盘,也需要拒绝非数字字符,因为用户仍然可以通过硬件键盘输入非数字.
另一个说明.我在第4和第7位数字输入后添加连字符,以便更容易删除数字.如果在第3和第6位后添加,则必须处理删除悬空连字符的情况.下面的代码避免了这个用例.
// Restrict entry to format 123-456-7890
- (BOOL) textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
// All digits entered
if (range.location == 12) {
return NO;
}
// Reject appending non-digit characters
if (range.length == 0 &&
![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
return NO;
}
// Auto-add hyphen before appending 4rd or 7th digit
if (range.length == 0 &&
(range.location == 3 || range.location == 7)) {
textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
return NO;
}
// Delete hyphen when deleting its trailing digit
if (range.length == 1 &&
(range.location == 4 || range.location == 8)) {
range.location--;
range.length = 2;
textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
dingo sky的答案很好,但是在帮助未来遇到这个解决方案的人们的兴趣中,有一些问题.Dingo的解决方案允许您将长数字字符串粘贴到破坏委托"规则"的字段中,因为它仅使用范围位置进行格式化和长度.(你可以有超过12个字符,没有连字符).
简单的解决方案是计算结果字符串的长度,并每次重新格式化.
Dingo答案的更新版本如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//calculate new length
NSInteger moddedLength = textField.text.length-(range.length-string.length);
// max size.
if (moddedLength >= 13) {
return NO;
}
// Reject non-number characters
if (range.length == 0 &&![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
return NO;
}
// Auto-add hyphen before appending 4rd or 7th digit
if ([self range:range ContainsLocation:3] || [self range:range ContainsLocation:7]) {
textField.text = [self formatPhoneString:[textField.text stringByReplacingCharactersInRange:range withString:string]];
return NO;
}
return YES;
}
#pragma mark helpers
-(NSString*) formatPhoneString:(NSString*) preFormatted
{
//delegate only allows numbers to be entered, so '-' is the only non-legal char.
NSString* workingString = [preFormatted stringByReplacingOccurrencesOfString:@"-" withString:@""];
//insert first '-'
if(workingString.length > 3)
{
workingString = [workingString stringByReplacingCharactersInRange:NSMakeRange(3, 0) withString:@"-"];
}
//insert second '-'
if(workingString.length > 7)
{
workingString = [workingString stringByReplacingCharactersInRange:NSMakeRange(7, 0) withString:@"-"];
}
return workingString;
}
-(bool) range:(NSRange) range ContainsLocation:(NSInteger) location
{
if(range.location <= location && range.location+range.length >= location)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
对于这样的事情,我建议使用UITextFieldDelegate来检测用户何时键入新字符.设置文本字段的委托如下:
[textField setDelegate:self];
Run Code Online (Sandbox Code Playgroud)
然后,根据需要实现委托方法:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder]; // hide the keyboard
return NO;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// every time the length reaches four, it gets reset to 0 and a '-' is added.
static int currentLength = 0;
if ((currentLength += [string length]) == 4) {
currentLength = 0;
[textField setText:[NSString stringWithFormat:@"%@%@%c", [textField text], string, '-'];
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
这可能不会完美,但我希望它有所帮助!
| 归档时间: |
|
| 查看次数: |
11758 次 |
| 最近记录: |