Ich habe einen NSFormatter in Swift, der an ein NSTextField angeschlossen ist. Es verhindert, dass unzulässige Zeichen eingegeben werden, aber wenn ich versuche, auf den Wert des nächsten Feldes zuzugreifen, gibt es einen Nullwert.Benutzerdefinierter NSFormatter, der nil in swift zurückgibt
Unten ist die Klasse:
class PSEntryNameFormatter : NSFormatter {
override func stringForObjectValue(obj: AnyObject?) -> String? {
if obj == nil {
println("stringForObjectValue: obj is nil, returning nil")
return nil
}
if let o = obj as? String {
println("stringForObjectValue: obj is string, returning \(o)")
return o
}
println("stringForObjectValue: obj is not string, returning nil")
return nil
}
override func getObjectValue(obj: AutoreleasingUnsafeMutablePointer<AnyObject?>, forString string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {
println("getObjectValue: \(string)")
let obj = string
return true
}
override func isPartialStringValid(partialString: String?, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {
if let s = partialString {
var illegals : String = join("",s.componentsSeparatedByCharactersInSet(PSEntryNameFormatterCharacterSet))
var goods = s.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: illegals))
let newString : NSString = join("", goods)
if String(newString) == s {
println("isPartialStringValid: partial string ok")
return true
}
}
println("isPartialStringValid: partial string bad")
return false
}
}
Und hier ist, wie ich versuche, zuzugreifen:
func control(control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool {
println("Text should end editing")
if (control == nameTextField) {
var name = nameTextField.objectValue as String
setObjectName(name)
}
return true
}
Zum Debuggen mir die println-Anweisungen hinzufügen, und hier ist das, was passiert, wenn das Textfeld gesetzt ich lösche zwei Zeichen ‚Vorlage‘ und dann:
stringForObjectValue: obj is string, returning Template
stringForObjectValue: obj is string, returning Template
isPartialStringValid: partial string ok
getObjectValue: Templat
isPartialStringValid: partial string ok
getObjectValue: Templa
dann drücke ich ein:
getObjectValue: Templa
Text should end editing
getObjectValue: Templa
stringForObjectValue: obj is nil, returning nil
getObjectValue:
stringForObjectValue: obj is nil, returning nil
stringForObjectValue: obj is nil, returning nil
fatal error: unexpectedly found nil while unwrapping an Optional value
Und dann stürzt es auf der Leitung ab, wenn ich in String string. Natürlich kann ich den Absturz verhindern, aber zuerst möchte ich herausfinden, warum es null gibt. Jede Hilfe sehr geschätzt!
Danke, das funktioniert - haben Sie weitere Erklärungen, d. H. Wo haben Sie herausgefunden, wie das geht? –
Ich fragte über die Apple-Diskussionsforen und bekam diese Antwort: https://forums.developer.apple.com/message/44288#44288 – ericg
@Kevin - Danke. Es funktioniert jetzt auch für mich .... – Devang