2014-10-27 12 views
8

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!

Antwort

9

Das Problem liegt in Ihrer Funktion getObjectValue.

Sie sollten den Wert auf diese Weise werden die Zuordnung:

obj.memory = string 

statt

let obj = string 
+0

Danke, das funktioniert - haben Sie weitere Erklärungen, d. H. Wo haben Sie herausgefunden, wie das geht? –

+0

Ich fragte über die Apple-Diskussionsforen und bekam diese Antwort: https://forums.developer.apple.com/message/44288#44288 – ericg

+0

@Kevin - Danke. Es funktioniert jetzt auch für mich .... – Devang

0

Ich habe ein ähnliches Problem und bekam einen teilweise fix:

override func stringForObjectValue(obj: AnyObject) -> String? { 
    if let desc = obj.description { 
    println("sFO=\(obj)") 
    } else { 
    println("sFO=nil") 
    } 
    return obj.description 
} 

Aber jedes Mal, wenn ich Registerkarte aus dem Feld wird sein Inhalt wieder gesetzt zu null. Immer noch dabei. Ich hatte kein Problem mit dem analogen OC-Code.

+1

gab ich schließlich die Formatierer und NSTextFieldDelegate/controlTextDidChange verwendet, was zu überprüfen, wurde eingegeben und entsprechend reagieren. Ehrlich gesagt war der resultierende Code noch lesbarer. –

+0

Das hat das Problem leider nicht gelöst, ich denke es ist ein Bug. Entschuldigung, ich kann die Antwort nicht akzeptieren, werde aber deinen Kommentar verbessern. –

Verwandte Themen