NSSearchField 输入的 NumberFormatter
NumberFormatter for NSSearchField input
我有一个 NSSearchField
,用户可以在其中输入带小数的数字来搜索数据。我在使用 NumberFormatter
显示正确格式时遇到问题。
我在 IB 中添加了这个:
发生的事情是,一旦用户键入小数点(或任何本地字符),该字段就会变为空。当我输入一个字母时也会发生同样的情况(这是预期的),所以小数点似乎被拒绝了,就好像它是一个字母一样。当然不是我想要的
在图片中间尝试了这些复选框的多种不同组合(包括 "Generate Decimal Numbers"),但无法正常工作。
如果您查看图片底部的示例,看起来还不错。
并且代码中没有任何操作搜索字段的内容。
我最终通过完全删除格式化程序并只过滤 controlTextDidChange
中的字符串解决了这个问题。请注意,这适用于 NSTextField
和 NSSearchField
。
class ViewController: NSViewController {
@IBOutlet var searchField: NSSearchField! // delegate is set in SB
lazy var decimalCharacterSet: CharacterSet = {
var charSet = CharacterSet.init(charactersIn: "0123456789")
charSet.insert(charactersIn: Locale.current.decimalSeparator!)
return charSet
}()
}
extension ViewController: NSControlTextEditingDelegate {
func controlTextDidChange(_ notification: Notification) {
if let textField = notification.object as? NSTextField {
// first filter out all the non-numbers
let chars = textField.stringValue.components(separatedBy: decimalCharacterSet.inverted)
var result = chars.joined()
// now check if there are more than one decimal separators
let count = result.filter { [=10=] == Character(Locale.current.decimalSeparator!) }.count
// if so, remove the last character in the string, this is what has just been typed.
if count > 1 {
result = String(result.dropLast())
}
// finally, assign the filtered string back to the textField
textField.stringValue = result
}
}
}
我有一个 NSSearchField
,用户可以在其中输入带小数的数字来搜索数据。我在使用 NumberFormatter
显示正确格式时遇到问题。
我在 IB 中添加了这个:
发生的事情是,一旦用户键入小数点(或任何本地字符),该字段就会变为空。当我输入一个字母时也会发生同样的情况(这是预期的),所以小数点似乎被拒绝了,就好像它是一个字母一样。当然不是我想要的
在图片中间尝试了这些复选框的多种不同组合(包括 "Generate Decimal Numbers"),但无法正常工作。
如果您查看图片底部的示例,看起来还不错。
并且代码中没有任何操作搜索字段的内容。
我最终通过完全删除格式化程序并只过滤 controlTextDidChange
中的字符串解决了这个问题。请注意,这适用于 NSTextField
和 NSSearchField
。
class ViewController: NSViewController {
@IBOutlet var searchField: NSSearchField! // delegate is set in SB
lazy var decimalCharacterSet: CharacterSet = {
var charSet = CharacterSet.init(charactersIn: "0123456789")
charSet.insert(charactersIn: Locale.current.decimalSeparator!)
return charSet
}()
}
extension ViewController: NSControlTextEditingDelegate {
func controlTextDidChange(_ notification: Notification) {
if let textField = notification.object as? NSTextField {
// first filter out all the non-numbers
let chars = textField.stringValue.components(separatedBy: decimalCharacterSet.inverted)
var result = chars.joined()
// now check if there are more than one decimal separators
let count = result.filter { [=10=] == Character(Locale.current.decimalSeparator!) }.count
// if so, remove the last character in the string, this is what has just been typed.
if count > 1 {
result = String(result.dropLast())
}
// finally, assign the filtered string back to the textField
textField.stringValue = result
}
}
}