我试图让它成为一个NSTextField
只会在Mac应用程序中接受像12.4
和3.6
这样的数字和句号。
在审查了其他SO问题之后,我觉得自己变得非常接近,但我无法理解。下面的代码工作,但它不允许.
字符。它返回true
并且当我键入.
时不会发出哔哔声,但它不会让角色出现在该字段中。
class decimalFormatter: NumberFormatter {
override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
//Allows the text to be deleted
if partialString.isEmpty {
return true
}
//Check for #.# numbers
let charSet = NSCharacterSet(charactersIn: "1234567890.").inverted
if partialString.rangeOfCharacter(from: charSet) != nil{
NSBeep()
return false
}else{
return true
}
}
}
知道我做错了什么吗?
我找到了一种更简单的方法。在controlTextDidChange
里面我刚刚这样做了:
let charSet = NSCharacterSet(charactersIn: "1234567890.").inverted
let chars = fieldDuration.stringValue.components(separatedBy: charSet)
fieldDuration.stringValue = chars.joined()
它很棒!
@Clifton Labrum解决方案非常棒,但它不会将字段缩小为十进制(#。#),你可以将一些输入作为1.2.4
,这会在尝试将其投射到Float
时导致错误。
这是一个对我来说很好的扩展草案(在Swift 4中)
public override func controlTextDidChange(_ obj: Notification) {
if let textfield = obj.object as? NSTextField,
textfield == self.quantityTextField {
var stringValue = textfield.stringValue
// First step : Only '1234567890.' - @Clifton Labrum solution
let charSet = NSCharacterSet(charactersIn: "1234567890.").inverted
let chars = stringValue.components(separatedBy: charSet)
stringValue = chars.joined()
// Second step : only one '.'
let comma = NSCharacterSet(charactersIn: ".")
let chuncks = stringValue.components(separatedBy: comma as CharacterSet)
switch chuncks.count {
case 0:
stringValue = ""
case 1:
stringValue = "\(chuncks[0])"
default:
stringValue = "\(chuncks[0]).\(chuncks[1])"
}
// replace string
textfield.stringValue = stringValue
}
}
这可以防止.
的多次出现,即使我知道这不是最好的算法方法。例如1.2.4
在粘贴时变为1.2
,并且通过键盘你不能添加另一个.