2014-08-27 24 views
16

Có ai thực hiện thành công NSValueTransformer tùy chỉnh trong xcode 6 beta với nhanh không?NSValueTransformer tùy chỉnh trong xcode 6 với swift

Tôi có lớp nhanh chóng sau:

import Foundation 

class myTransformer: NSValueTransformer { 

    let amount = 100 

    override class func transformedValueClass() -> AnyClass! 
    { 
    return NSNumber.self 
    } 

    override func transformedValue(value: AnyObject!) -> AnyObject! { 
    return value.integerValue + amount 
    } 
} 

Vì vậy, tất cả các biến này nên làm là thêm 100 đến một giá trị được đưa ra trong gui.

Như bạn có thể thấy, lớp biến áp xuất hiện ngay bây giờ trong trình giảm giá trị biến đổi trong IB.

enter image description here

Nhưng nếu tôi chọn biến áp này bị treo ứng dụng với:

2014-08-27 20:12:17.686 cdTest[44134:303] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Cannot find value transformer with name newTransformer' 

Có quyền đăng ký biến này trong appdelegate với

override class func initialize() { 
    let newTransformer = myTransformer() 
} 

Có ai biết làm thế nào đây toàn bộ công cụ phải hoạt động?

Trân trọng! martin

+0

Tôi đoán đó là tên mangling nhanh chóng. Hãy thử khai báo nó với @objc để giải quyết vấn đề đó. –

Trả lời

3

Sau khi bạn khởi newTransformer bạn cũng nên bao gồm các dòng:

NSValueTransformer.setValueTransformer(newTransformer, forName: "myTransformer") 

Sau đó, trong giao diện Builder của bạn, bạn nên sử dụng myTransformer thay vì newTransformer dưới thả xuống Value Transformer.

+0

Đây không phải là câu trả lời hay nhất. – ioquatix

+0

đọc câu trả lời dưới đây! –

33

Từ Xcode ghi chú phát hành:

Nếu bạn đặt một lớp con Swift của NSValueTransformer như một ràng buộc của giá trị biến áp, XIB hoặc kịch bản sẽ chứa một tham chiếu không hợp lệ đến lớp, và các ràng buộc sẽ không hoạt động đúng lúc chạy. Bạn có thể nhập tên lớp bị xén vào trường Biến áp giá trị hoặc thêm thuộc tính @objc (…) vào lớp con NSValueTransformer để giải quyết vấn đề này. (17495784)

Từ Swift dẫn:

Để làm cho lớp Swift bạn dễ tiếp cận và sử dụng trở lại trong Objective-C, làm cho nó một hậu duệ của một lớp Objective-C hoặc đánh dấu nó với @ objc thuộc tính. Để chỉ định một tên đặc biệt cho lớp để sử dụng trong Objective-C, đánh dấu nó với @objc (< # Tên #>), nơi < # Tên #> là tên rằng mã Objective-C của bạn sẽ sử dụng để tham khảo Swift class. Để biết thêm thông tin về @objc , hãy xem Swift Type Compatibility.

Giải pháp:

Khai báo lớp học của bạn như @objc(myTransformer) class myTransformer: NSValueTransformer và sau đó bạn có thể sử dụng "myTransformer" như tên gọi ...

+0

Điều này cố định mọi thứ cho tôi. Một tài nguyên tuyệt vời khác đã giúp — bài viết của NSHipster về NSValueTransformer: http://nshipster.com/nsvaluetransformer/ –

+0

Cảm ơn bạn đã trả lời hoàn hảo! – Satachito

+0

Tôi sắp bỏ phiếu và nhận ra rằng tôi đã có đôi khi trong quá khứ. ++ 2 –

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