IOS开发问题解决之限制UITextField输入特定位数小数时,Done按钮失效

本文探讨了在iOS开发中限制UITextField输入为一位小数时,如何避免Done按钮失效的问题。通过重写textField:shouldChangeCharactersInRange:replacementString:函数,实现对输入字符的过滤,确保只允许输入有效的一位小数,并解决了Done按钮事件被过滤导致的失效问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

IOS开发问题解决之限制UITextField输入特定位数小数时,Done按钮失效

分类: IOS开发问题解决   1045人阅读  评论(0)  收藏  举报

目录(?)[+]

问题描述

      要求是限制UITextField只能输入一位小数。我的方法是重写delegate的textField:shouldChangeCharactersInRange:replacementString:函数。自己写的代码如下:

[cpp]  view plain copy
  1. -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  
  2.       
  3.     isHasRadixPoint = YES;  
  4.     NSString *existText = textField.text;  
  5.     if ([existText rangeOfString:@"."].location == NSNotFound) {  
  6.         isHasRadixPoint = NO;  
  7.     }  
  8.     if (string.length > 0) {  
  9.         unichar newChar = [string characterAtIndex:0];  
  10.         if ((newChar >= '0' && newChar <= '9') || newChar == '.' ) {  
  11.             if (newChar == '.') {  
  12.                 if (isHasRadixPoint)   
  13.                     return NO;  
  14.                 else   
  15.                     return YES;                  
  16.             }else {  
  17.                 if (isHasRadixPoint) {  
  18.                     NSRange ran = [existText rangeOfString:@"."];  
  19.                     int radixPointCount = range.location - ran.location;  
  20.                     if (radixPointCount <= RadixPointNum) return YES;  
  21.                     else return NO;  
  22.                 } else   
  23.                     return YES;  
  24.             }  
  25.               
  26.         }else {  
  27.             return NO;  
  28.         }  
  29.           
  30.     }else {  
  31.         return YES;  
  32.     }  
  33. }  

     写完测试,这时问题来了。键盘上的"Done"按钮失效了。上面代码中的RandixPointNum是在文件最上边部分定义的宏,代表小数点位数。

解决方法

     “Done”按钮其实就是字符“\n”,由于上面的代码将其过滤了,导致了其事件失效。修改后代码如下,注意有注释的那行:

[cpp]  view plain copy
  1. -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{  
  2.       
  3.     isHasRadixPoint = YES;  
  4.     NSString *existText = textField.text;  
  5.     if ([existText rangeOfString:@"."].location == NSNotFound) {  
  6.         isHasRadixPoint = NO;  
  7.     }  
  8.     if (string.length > 0) {  
  9.         unichar newChar = [string characterAtIndex:0];  
  10.         if ((newChar >= '0' && newChar <= '9') || newChar == '.' ) {  
  11.             if (newChar == '.') {  
  12.                 if (isHasRadixPoint)   
  13.                     return NO;  
  14.                 else   
  15.                     return YES;                  
  16.             }else {  
  17.                 if (isHasRadixPoint) {  
  18.                     NSRange ran = [existText rangeOfString:@"."];  
  19.                     int radixPointCount = range.location - ran.location;  
  20.                     if (radixPointCount <= RadixPointNum) return YES;  
  21.                     else return NO;  
  22.                 } else   
  23.                     return YES;  
  24.             }  
  25.               
  26.         }else {  
  27.             if ( newChar == '\n'return YES;       // 这句非常重要:不然将导致“Done”按钮失效  
  28.             return NO;  
  29.         }  
  30.           
  31.     }else {  
  32.         return YES;  
  33.     }  
  34. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值