强制NSTextField仅接受十进制(#。#)数字和句点

问题描述 投票:2回答:2

我试图让它成为一个NSTextField只会在Mac应用程序中接受像12.43.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
    }

  }
}

知道我做错了什么吗?

swift3 nstextfield nscharacterset
2个回答
2
投票

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

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

它很棒!


0
投票

@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,并且通过键盘你不能添加另一个.

© www.soinside.com 2019 - 2024. All rights reserved.