ジェネリック溶液(バインディングの有無にかかわらず仕事)これに対処する一つの方法は、応答here
に基づいていますが基本的にはNSTextField
のcontrolTextDidChange(notification:)
デリゲートメソッドを使用すると、あなたはそれであなたの検証コードを実装します。
明らか
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
....
}
}
myTextFieldOutlet
は、あなたのテキストフィールドにリンクされているコンセントであるとmyErrorLabelOutlet
は(エラーが提示されるべきでない場合は空白の)エラーを表示するために使用便利な場所にあるラベルへの出口である解決策はして指向
バインディングValidates immediately
確認は、Interface Builderで選択し、
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"])
}
}
(あなたの例ではTuning View Controller
)結合が行われ、クラスに次のメソッドを実装していますエラーがスローされると、エラーを通知する標準シートが表示され、変更をキャンセルまたは訂正するオプションが表示されます。
Interface BuilderでContinuously updates value
が選択されている場合は、テキストフィールドの各キーストロークに対して上記のメソッドが呼び出されます。それ以外の場合は、Enter
を押すか、フォーカスを失うだけです。
注:Validates immediately
の内容を含め、バインディングによる値の更新の仕組みについては、hereを参照してください。
@JoshuaNozzi私はNSViewControllerでこれを実装しようとしました – Arti
@JoshuaNozziしかし、何の引数が必要なのか分かりません...迅速にいくつかの例がありますか? – Arti
@JoshuaNozzi私はコードを持っていません。そして、問題のスクリーンショットを表示してください – Arti