Пользовательский 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.