简体   繁体   中英

os x nstextfield validation

I have a variable in my NSViewController :

dynamic var roll_rate:Double = 0.0

I attach it to my NSTextField :

在此处输入图片说明

Model Key Path shows error, but it is working: When i changed value in field, variable changed too. But what means: Validates Immediately and how do i show and check validation errors for field.

I tried implement method validateRoll_rate , but it didn't call when value changed.

Generic solution (work with or without bindings) One way of dealing with this is based on the response here

Basically you use the controlTextDidChange(notification:) delegate method of NSTextField and you implement your validation code in it.

 override func controlTextDidChange (notification: NSNotification) {
    guard let textField = notification.object as? NSTextField else { return }

    // test here, replace the dummy test below with something useful
    if textField.stringValue != "expected value" {
        myTextFieldOutlet.backgroundColor = NSColor.red
        myErrorLabelOutlet.stringValue = "Error !!!"
    } else {
        // everything OK, reset the background color and error label to the normal state
        ....
    }
 }

Obviously myTextFieldOutlet is an outlet linked to your text field and myErrorLabelOutlet is an outlet to a conveniently placed label used to show errors (blank if no error should be presented)

Bindings oriented solution Be sure Validates immediately is selected in Interface Builder and implement the following method in the class where the binding is made ( Tuning View Controller in your example)

override func validateValue(_ ioValue: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKey inKey: String) throws {
    // test here, replace the dummy test below with something useful
    if roll_rate > 10.0 {
        throw NSError(domain: "your-domain", code: 100, userInfo: [NSLocalizedDescriptionKey: "Error, roll rate too high"])
    }
}

When the error is thrown, the user will be presented with the standard sheet announcing the error and the option to cancel the change or correct it.

If Continuously updates value is selected in Interface Builder the method above will be called for each keystroke in the text field, otherwise only after pressing Enter or loosing focus.

Note: For a full understanding on how updating values through bindings work, including what Validates immediately does, see the docs here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM