自定义NSFormatter在swift中返回nil

时间:2014-10-27 15:13:23

标签: macos swift nsformatter

我在Swift中有一个NSFormatter,它附加到NSTextField。它可以防止输入非法字符,但是当我尝试访问下一个字段的值时,它会给出一个nil值。

以下是课程:

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语句,这是当textfield设置为'Template'然后删除两个字符时会发生的情况:

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

然后当我转换成字符串时它就崩溃了。显然我可以防止崩溃,但首先我想找出它返回零的原因。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:10)

问题出在你的getObjectValue函数中。

您应该以这种方式分配值:

obj.memory = string

而不是

let obj = string

答案 1 :(得分:0)

我遇到了类似问题并得到了部分修复:

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

但每次我跳出该字段时,其内容再次设置为nil。仍然坚持这一点。我对模拟OC代码没有任何问题。