मैं definitve जवाब मैं डेव मार्क और जेफ LeMarche द्वारा अधिक iPhone 3 विकास में पाया व्याख्या करेंगे:
आमतौर पर हम डिफ़ॉल्ट के रूप में बदला जाने वाला विशेषता के ट्रांसफार्मर वर्ग छोड़ने के लिए सक्षम होगा, NSKeyedUnarchiveFromData, और किया जा सकता है, लेकिन इस मामले में हम नहीं कर सकते क्योंकि UIColor
NSCoding
के अनुरूप नहीं है और NSKeyedArchiver
का उपयोग करके संग्रहीत नहीं किया जा सकता है। परिवर्तन को संभालने के लिए हमें मैन्युअल रूप से मूल्य ट्रांसफार्मर लिखना होगा।
अपनी इकाई में एक विशेषता जोड़ें और विशेषता "रंग" या जो भी नाम आप चाहते हैं उसे कॉल करें। इसके प्रकार को ट्रांसफॉर्म करने योग्य पर सेट करें। अपने "वैल्यू ट्रांसफार्मर नेम" को पर सेट करें UIColorRGBValueTransformer। ध्यान दें कि डेटा मॉडल संपादक यह सुनिश्चित करने के लिए वैल्यू ट्रांसफार्मर नाम: मान्य नहीं करता है, इसलिए ध्यान से टाइप करें।
एक नई फ़ाइल, NSObject
का एक उपवर्ग बनाएँ, और इसे नाम UIColorRGBValueTransformer.m।
पर क्लिक करें UIColorRGBValueTransformer.h और NSObject से NSValueTransformer में सुपरक्लास बदलें। इसके अलावा, #import <Foundation/Foundation.h>
से #import <UIKit/UIKit.h>
बदलें, क्योंकि UIColor
UIKit
का हिस्सा है, Foundation
नहीं।
अब UIColorRGBValueTransformer.m में, हम चार विधियों है कि हमारे मूल्य ट्रांसफार्मर वर्ग NSData
और इसके विपरीत UIColor
के उदाहरण रूपांतरित करने की अनुमति को लागू करने की जरूरत है। UIColorRGBValueTransformer.m में यह कोड शामिल: में UIColorRGBValueTransformer.hआयात करने के लिए की जरूरत के बिना
[self.managedObject setValue:color forKey:self.keyPath];
:
#import "UIColorRGBValueTransformer.h"
@implementation UIColorRGBValueTransformer
// Here we override the method that returns the class of objects that this transformer can convert.
+ (Class)transformedValueClass {
return [NSData class];
}
// Here we indicate that our converter supports two-way conversions.
// That is, we need to convert UICOLOR to an instance of NSData and back from an instance of NSData to an instance of UIColor.
// Otherwise, we wouldn't be able to beth save and retrieve values from the persistent store.
+ (BOOL)allowsReversTransformation {
return YES;
}
// Takes a UIColor, returns an NSData
- (id)transfomedValue:(id)value {
UIColor *color = value;
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]];
return [colorAsString dataUsingEncoding:NSUTF8StringEncoding];
}
// Takes an NSData, returns a UIColor
- (id)reverseTransformedValue:(id)value {
NSString *colorAsString = [[[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding] autorelease];
NSArray *components = [colorAsString componentsSeparatedByString:@","];
CGFloat r = [[components objectAtIndex:0] floatValue];
CGFloat g = [[components objectAtIndex:1] floatValue];
CGFloat b = [[components objectAtIndex:2] floatValue];
CGFloat a = [[components objectAtIndex:3] floatValue];
return [UIColor colorWithRed:r green:g blue:b alpha:a];
}
@end
एक और फाइल में अब, आप की तरह कोड की एक पंक्ति शामिल कर सकते हैं फ़ाइल।
इस उत्तर अद्भुत है, यह पता लगा है | कभी नहीं । एक छोटा संपादन, "रिवर्स ट्रान्सफॉर्मेशन" और "ट्रांसफॉम्ड वैल्यू" गलत वर्तनी है, लेकिन आवश्यक 6 अक्षरों के संपादन के लिए केवल 2 खाते को ठीक करना है। – rob5408
हालांकि इसके लिए काम किया गया था, यह ध्यान दिया जाना चाहिए कि यूआईसीओलोर वास्तव में एनएससीओडी के अनुरूप है (उपर्युक्त क्या है इसके विपरीत) और एक विशेष ट्रांसफॉर्मर की आवश्यकता नहीं होनी चाहिए। – rob5408