Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where do I register a ValueTransformer in Swift?

Tags:

macos

swift

cocoa

I'm trying to use a ValueTransformer (né NSValueTransformer) in Swift that is being used by the first window that my application opens. Value transformers need to be registered with ValueTransformer.registerValueTransformer(_:forName:) before they can be queried by the user interface runtime.

The documentation for NSValueTransformer recommends registering value transformers in +[AppDelegate initialize]. However, Swift doesn't allow you to override +initialize. I tried to register from applicationWillFinishLaunching(_) and applicationDidFinishLaunching(_), but they both happen too late and my window doesn't get filled because the runtime can't find the value transformer.

Where should I register my value transformer?

like image 692
zneak Avatar asked Mar 06 '18 17:03

zneak


2 Answers

In AppDelegate you can use a dummy property of type Void with a closure. The closure is even executed before init

private let transformer : Void = {
    let myTransformer = MyValueTransformer()
    ValueTransformer.setValueTransformer(myTransformer, forName:NSValueTransformerName("MyValueTransformer"))
}()
like image 78
vadian Avatar answered Nov 10 '22 20:11

vadian


I found that I can count on the app delegate class to be initialized early and only once, so I stuck my ValueTransformer.registerValueTransformer call in it.

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    override init() {
        ValueTransformer.setValueTransformer(MyValueTransformer(), forName: NSValueTransformerName("MyValueTransformer"))
    }
}
like image 3
zneak Avatar answered Nov 10 '22 21:11

zneak