2

我正在努力使它NSTextField只接受数字和句点,例如12.4Mac3.6应用程序。

在查看其他 SO 问题后,我觉得我已经很接近了,但我不太明白。下面的代码有效,但它不允许.字符。当我输入 a 时它会返回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
    }

  }
}

知道我做错了什么吗?

4

2 回答 2

2

我找到了一种更简单的方法来做到这一点。在里面controlTextDidChange我只是这样做了:

let charSet = NSCharacterSet(charactersIn: "1234567890.").inverted
let chars = fieldDuration.stringValue.components(separatedBy: charSet)
fieldDuration.stringValue = chars.joined()

效果很好!

于 2017-01-11T02:01:29.403 回答
1

@Clifton Labrum 解决方案非常棒,但它不会将字段减少到Decimal (#.#),您仍然可以输入一些输入,因为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,通过键盘你不能添加另一个.

于 2018-09-13T10:04:07.013 回答