2014-10-27 94 views
8

我有一个Swift中的NSFormatter,它附加到NSTextField。它可以防止输入非法字符,但是当我尝试访问下一个字段的值时,它会给出一个零值。自定义NSFormatter快速返回零

下面是类:

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 
    } 
} 

这里是我如何努力访问:

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 
} 

对于调试我添加println语句,这里是当文本字段设置发生了什么然后删除两个字符:

stringForObjectValue: obj is string, returning Template 
stringForObjectValue: obj is string, returning Template 
isPartialStringValid: partial string ok 
getObjectValue: Templat 
isPartialStringValid: partial string ok 
getObjectValue: Templa 

然后我按回车键:

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 

然后当我投射到字符串时它崩溃了。显然我可以防止崩溃,但首先我想知道为什么它返回零。非常感谢任何帮助!

回答

9

问题出在你的getObjectValue函数中。

你应该以这种方式分配值:的

obj.memory = string 

代替

let obj = string 
+0

谢谢你的工作 - 你有什么更多的解释,即你在哪里找到如何做到这一点? – 2015-01-11 11:28:23

+0

我问了Apple讨论板上的问题,并得到了这个答案:https://forums.developer.apple.com/message/44288#44288 – ericg 2015-08-23 18:12:55

+0

@Kevin - 谢谢。它现在对我来说工作得很好.... – Devang 2016-11-23 07:36:37

0

我有类似的问题,并得到了部分修复:

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

但每次我出标签的内容设置为再次零领域。仍然坚持。我对模拟OC代码没有任何问题。

+1

我终于放弃了使用格式和使用NSTextFieldDelegate/controlTextDidChange检查任何已进入并做出相应的反应。老实说,最终的代码更具可读性。 – 2014-11-01 22:54:15

+0

这并没有解决不幸的问题,我认为这是一个错误。抱歉,我无法接受答案,但会对您的评论满意。 – 2014-11-12 13:47:48