只允许UITextField输入数字

iPad不像iPhone/iPod那样有“Numpad”键盘

我正在寻找如何限制用户键盘只接受0到9的值

我可以想象使用UITextField的“shouldChangeCharactersInRange”,但我不知道实现它的最佳方法

这是处理SSN验证字段问题的方法,如果需要,可以修改最大长度并删除检查键盘类型的if语句

与粘贴数据相反,当用户键入时,也有抑制最大长度警报的逻辑

在这段代码的上下文中,presentAlert()/presentAlert:只是一些基本函数,它使用传递的消息字符串表示UIAlertController(或传统的UIAlertView

斯威夫特5

//注意:此代码假定您已将UITextField的委托属性设置为
//对象,否则将永远不会调用它。
//
//在Swift中也有一些更好的文体方法来避免所有的错误
//嵌套语句,但我希望保持样式与其他语句相似
//比较这两种语言要容易一些。
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->;布尔{
//句柄退格/删除
守卫!绳子。我还有空吗{
//检测到退格,允许更改文本,无需进一步处理文本
返回真值
}
//输入验证
//如果键盘为numberpad,则防止无效字符输入
如果textField.keyboardType==.numberPad{
//检查输入字符是否无效
if CharacterSet(charactersIn:“0123456789”).issupertet(of:CharacterSet(charactersIn:string)){
//显示警报,以便用户知道出了什么问题
presentAlert(“此字段仅接受数字输入。”)
//检测到无效字符,不允许更改文本
返回错误
}
}
//长度处理
//需要将NSRange转换为合适的类型
如果let text=textField.text,则let range=range(范围,in:text){
让proposedText=text.replacingCharacters(在:范围内,带:字符串)
//检查建议的文本长度是否不超过最大字符数
guard proposedText.count<=maxCharacters else{
//如果粘贴文本,则显示警报
//简单:粘贴的数据长度大于1;谁复制/粘贴一个字符?
如果string.count>1{
//粘贴文本,显示警报,以便用户知道出了什么问题
presentAlert(“粘贴失败:超过最大字符数。”)
}
//超出字符数,不允许更改文本
返回错误
}
//仅当他们输入了过去四个月的所有数字时,才启用“确定/提交”按钮
//他们的SSN(防止早期提交/访问身份验证服务器等)
answerButton.isEnabled=(proposedText.count==4)
}
//允许文本更改
返回真值
}

目标-C

//注意:此代码假定您已将UITextField的委托属性设置为
//对象,否则将永远不会调用它。
-(BOOL)textField:(UITextField*)textField应更改字符范围:(NSRange)范围替换字符串:(NSString*)字符串
{
//句柄退格/删除
如果(!string.length)
{
//检测到退格,允许更改文本,无需进一步处理文本
返回YES;
}
//输入验证
//如果键盘为numberpad,则防止无效字符输入
if(textField.keyboardType==UIKeyboardTypeNumberPad)
{
if([string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet].InversedSet].location!=NSNotFound)
{
[self-presentAlert:@“此字段仅接受数字条目。”;
返回否;
}
}
//长度验证
NSString*proposedText=[textField.text StringByReplacingCharactersRange:range with string:string];
//检查建议的文本长度是否不超过最大字符数
如果(建议的文本长度>最大字符数)
{
//如果粘贴文本,则显示警报
//简单:粘贴的数据长度大于1;谁复制/粘贴一个字符?
if(string.length>1)
{
//粘贴文本,显示警报,以便用户知道出了什么问题
[self-presentAlert:@“粘贴失败:超过最大字符数。”;
}
//超出字符数,不允许更改文本
返回否;
}
//仅当他们输入了过去四个月的所有数字时,才启用“确定/提交”按钮
//他们的SSN(防止早期提交/访问身份验证服务器等)
self.answerButton.enabled=(proposedText.length==maxCharacters);
//允许文本更改
返回YES;
}

发表评论