Пользовательский NSFormatter, возвращающий ноль в Swift

У меня есть NSFormatter в Swift, который подключен к NSTextField. Это предотвращает ввод недопустимых символов, но когда я пытаюсь получить доступ к значению следующего поля, оно дает нулевое значение.

Ниже приведен класс:

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

А потом он падает на линии, когда я приводил в строку. Очевидно, я могу предотвратить сбой, но сначала я хочу выяснить, почему он возвращается, ноль. Любая помощь очень ценится!

2 ответа

Решение

Проблема в вашей функции getObjectValue.

Вы должны назначить значение следующим образом:

obj.memory = string

вместо

let obj = string

У меня похожая проблема, и я получил частичное исправление:

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

Но каждый раз, когда я выхожу из поля, его содержимое снова устанавливается на ноль. Все еще застрял с этим. У меня не было проблем с аналоговым кодом OC.

Другие вопросы по тегам