2014-10-27 14 views
8

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!

Trả lời

9

Sự cố nằm trong hàm getObjectValue của bạn.

Bạn nên gán giá trị theo cách này:

obj.memory = string 

thay vì

let obj = string 
+0

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? –

+0

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

+0

@Kevin - Cảm ơn. Nó hoạt động tốt cho tôi quá .... – Devang

0

Tôi có một vấn đề tương tự và có cách khắc phục một phần:

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

Nhưng mỗi khi tôi tab ra khỏi lĩnh vực nội dung của nó được thiết lập để nil một lần nữa. Vẫn còn mắc kẹt với điều đó. Tôi không có vấn đề với mã OC tương tự.

+1

Cuối cùng tôi đã từ bỏ bằng cách sử dụng định dạng và sử dụng NSTextFieldDelegate/controlTextDidChange để kiểm tra bất cứ điều gì đã được nhập và phản ứng phù hợp. Thành thật mà nói, mã kết quả thậm chí còn dễ đọc hơn. –

+0

Điều này không giải quyết được sự cố, tôi cho rằng đó là lỗi. Xin lỗi tôi không thể chấp nhận câu trả lời, nhưng sẽ upvote bình luận của bạn. –

Các vấn đề liên quan