Tôi có một NSFormatter trong Swift, được gắn vào một NSTextField. Nó ngăn chặn các ký tự không hợp lệ được nhập vào, nhưng khi tôi cố gắng truy cập vào giá trị của trường tiếp theo, nó cho một giá trị nil.NSFormatter tùy chỉnh quay trở lại nil trong swift
Dưới đây là các lớp:
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
}
}
Và đây là cách tôi cố gắng truy cập:
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
}
Để gỡ lỗi tôi thêm những điều khoản println, và đây là những gì sẽ xảy ra khi các textfield được thiết lập thành 'Mẫu' và sau đó tôi xóa hai ký tự:
stringForObjectValue: obj is string, returning Template
stringForObjectValue: obj is string, returning Template
isPartialStringValid: partial string ok
getObjectValue: Templat
isPartialStringValid: partial string ok
getObjectValue: Templa
Sau đó, tôi nhấn enter:
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
Và sau đó nó gặp sự cố khi tôi truyền tới chuỗi. Rõ ràng tôi có thể ngăn chặn sự cố, nhưng trước tiên tôi muốn tìm hiểu lý do tại sao nó trở lại không. Bất kỳ trợ giúp rất nhiều đánh giá cao!
Cảm ơn tác phẩm này - bạn có giải thích thêm nào không, tức là bạn đã tìm hiểu cách thực hiện việc này? –
Tôi đã hỏi trên các bảng thảo luận của Apple và nhận được câu trả lời này: https://forums.developer.apple.com/message/44288#44288 – ericg
@Kevin - Cảm ơn. Nó hoạt động tốt cho tôi quá .... – Devang