2

Mac アプリのやNSTextFieldのような数字とピリオドのみを受け入れるようにしようとしています。12.43.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 に答える