设为首页 收藏本站
查看: 701|回复: 0

[经验分享] Creating NSFormatters(Chapter 26 of Cocoa Programming for Mac OS X)

[复制链接]

尚未签到

发表于 2015-12-31 09:24:52 | 显示全部楼层 |阅读模式
1 #import "ColorFormatter.h"
  2
  3 @interface ColorFormatter()
  4
  5 - (NSString *)firstColorKeyForPartialString:(NSString *)string;
  6
  7 @end
  8
  9 @implementation ColorFormatter
10
11 - (id)init
12 {
13     [super init];
14     colorList = [[NSColorList colorListNamed:@"Apple"] retain];
15     return self;
16 }
17
18 - (void)dealloc
19 {
20     [colorList release];
21     [super dealloc];
22 }
23
24 - (NSString *)firstColorKeyForPartialString:(NSString *)string
25 {
26     if([string length] == 0)
27     {
28         return nil;
29     }
30     
31     for(NSString *key in [colorList allKeys])
32     {
33         NSRange whereFound = [key rangeOfString:string options:NSCaseInsensitiveSearch];
34         if ((whereFound.location == 0) && (whereFound.length > 0))
35         {
36             return key;
37         }
38     }
39     
40     return nil;
41 }
42
43 - (NSString *)stringForObjectValue:(id)obj
44 {
45     if(![obj isKindOfClass:[NSColor class]])
46     {
47         return nil;
48     }
49     
50     NSColor *color;
51     color = [obj colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
52     
53     CGFloat red, green, blue;
54     [color getRed:&red green:&green blue:&blue alpha:NULL];
55     
56     float minDistance = 3.0;
57     NSString *closestKey = nil;
58     for(NSString *key in [colorList allKeys])
59     {
60         NSColor *c = [colorList colorWithKey:key];
61         CGFloat r, g, b;
62         [c getRed:&r green:&g blue:&b alpha:NULL];
63         
64         float dist;
65         dist = pow(red-r, 2) + pow(green-g, 2) + pow(blue-b, 2);
66         if(dist < minDistance)
67         {
68             minDistance = dist;
69             closestKey = key;
70         }
71     }
72     
73     return closestKey;
74 }
75
76 - (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error
77 {
78     NSString *matchingKey = [self firstColorKeyForPartialString:string];
79     if(matchingKey)
80     {
81         *obj = [colorList colorWithKey:matchingKey];
82         return YES;
83     }
84     else
85     {
86         if(error != NULL)
87         {
88             *error = [NSString stringWithFormat:@"'%@' is not a color", string];
89         }
90         return NO;
91     }
92
93 }
94
95 /*
96 - (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error
97 {
98     if([partialString length] == 0)
99     {
100         return YES;
101     }
102     
103     NSString *match = [self firstColorKeyForPartialString:partialString];
104     if(match)
105     {
106         return YES;
107     }
108     else
109     {
110         if (error)
111         {
112             *error = @"No such color";
113         }
114         return NO;
115     }
116 }
117 */
118
119 - (BOOL)isPartialStringValid:(NSString **)partial proposedSelectedRange:(NSRange *)selPtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSel errorDescription:(NSString **)error
120 {
121     if([*partial length] == 0)
122     {
123         return YES;
124     }
125     
126     NSString *match = [self firstColorKeyForPartialString:*partial];
127     if(!match)
128     {
129         return NO;
130     }
131     
132     if (origSel.location == selPtr->location)
133     {
134         return YES;
135     }
136     
137     if([match length] != [*partial length])
138     {
139         selPtr->location = [*partial length];
140         selPtr->length = [match length] - selPtr->location;
141         *partial = match;
142         return NO;
143     }
144     
145     return YES;
146 }
147
148 - (NSAttributedString *)attributedStringForObjectValue:(id)obj withDefaultAttributes:(NSDictionary *)attrs
149 {
150     NSMutableDictionary *md = [attrs mutableCopy];
151     NSString *match = [self stringForObjectValue:obj];
152     if(match)
153     {
154         [md setObject:obj forKey:NSForegroundColorAttributeName];
155     }
156     else
157     {
158         match = @"";
159     }
160     NSAttributedString *atString;
161     atString = [[NSAttributedString alloc] initWithString:match attributes:md];
162     [md release];
163     [atString autorelease];
164     return atString;
165 }
166
167 @end

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-158690-1-1.html 上篇帖子: 苹果全新 Mac OS X 系统开放下载 下篇帖子: Mac OS X 上的安装Lua开发环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表