Sha*_*han 3 objective-c uitextfield ios swift
如何使用 Swift 将 UITextField 限制为一位小数?文本字段用于输入价格,因此我不能允许超过一位小数。如果我使用 Objective-C,我会使用以下代码:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSArray *sep = [newString componentsSeparatedByString:@"."];
if([sep count] >= 2)
{
NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
return !([sepStr length]>1);
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
但由于 Swift 使用范围的方式不同,我无法将此代码转换为 Swift。第一行给了我一个错误说NSRange is not convertible to Range<String.Index>
编辑:在看到答案之前我最终这样做了:
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
let tempRange = textField.text.rangeOfString(".", options: NSStringCompareOptions.LiteralSearch, range: nil, locale: nil)
if tempRange?.isEmpty == false && string == "." {
return false
}
return true
}
Run Code Online (Sandbox Code Playgroud)
我在另一个帖子上找到了这个。这个解决方案工作正常,但我不确定这是否是最好的方法,但它是一种简短而干净的方法。
斯威夫特 4 和 Xcode 9.2
该解决方案仅允许输入一位小数点,因此允许有效的双精度数。
// Only allows one decimal point
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let arrayOfString = newString.components(separatedBy: ".")
if arrayOfString.count > 2 {
return false
}
return true
}
Run Code Online (Sandbox Code Playgroud)