objective-cnibnsvaluetransformer

How to pass contextual objects to NSValueTransformer


NSValueTransformer is used to transform a value. But what if the transformation needs more contextual information? For example how can a NSValueTransformer access other objects in the nib, or access the view controller? Is this just not what NSValueTransformer is meant to be used?

As an example I want to bind a text view's attributed string to an employee's name, using a value transformer to format the name based on the employee's department.

My solution so far has been to just implement a new employeeNameForDisplay property or so, skipping value transformers altogether.

If that's truly the best solution, I have a hard time understand the value of value transformers. Are they really this limited?


Solution

  • Doc quote ...

    NSValueTransformer is an abstract class that is used by the Cocoa Bindings technology to transform values from one representation to another.

    ... it's a very simple class, which transforms values between different representations. Sometimes I do use it with Cocoa Bindings, but I heavily do use it with CoreData where I need better (smaller, faster, ...) representation for underlying sqlite store. So, this class has the value for us even if you can't achieve your goal with it.

    Also I would solve like you do. New property along with ...

    + (NSSet *)keyPathsForValuesAffectingEmployeeNameForDisplay:(NSString *)key {
        return [NSSet setWithArray:@[ @"employeeName", @"employeeDepartment" ]];
    }