2012-11-01 13 views
1

Objective-C的宏我有顏色設置字典和嘗試這樣做:類消息

#define ColorWithString(x) [UIColor #x] 

NSDictionary *settings = @{@"color" : @"whiteColor"}; 
UIColor *color = ColorWithString(settings[@"color"]); 

我得到一個錯誤Expected identifier

我知道字符串預處理有一些微妙之處。也許甚至無法向課堂發送動態消息。任何建議,使這項工作?

回答

4

看看你的宏展開爲:

UIColor *color = [UIColor settings[@"color"]]; 

這顯然不是合法的Objective-C代碼。我想你可以結合使用performSelector:NSSelectorFromString

UIColor *color = [UIColor performSelector: 
    NSSelectorFromString(settings[@"color"])]; 

...但爲什麼不這樣做簡單嗎?

NSDictionary *colors = @{ 
    @"white" : [UIColor whiteColor], 
    @"red" : [UIColor redColor] 
}; 
+0

非常好的建議得到CGColorRef。我有一個具有多種顏色的配置plist,其中許多被定義爲'UIColor'上的方便類別,例如'[UIColor goldColor]'或'[UIColor colorWithHex:@「#00AA00」]'等等,所以這是還沒有完全正常工作...... – Mundi

+0

如果我有外部配置文件中的顏色,我想我會選擇存儲十六進制值並解析它們,因爲將配置值直接轉換爲選擇器名稱聽起來有點麻煩。如果你不介意,我想你可以採用我在答案中提出的'NSSelectorFromString'方式。 – zoul

+0

想想完全按照這種方式來做(十六進制值)。感謝您的輸入。 – Mundi

2

更改宏

#define ColorWithString(x) [UIColor performSelector:NSSelectorFromString(x)] 

然後你可以使用宏作爲

 NSDictionary *settings = @{@"color" : @"greenColor"};   
     UIColor *color = ColorWithString(settings[@"color"]); 

要從UIColor

CGColorRef colorRef = color.CGColor; 
+0

我一直得到一個神祕的錯誤,沒有堆棧跟蹤,但在線程'CGColorSpaceGetModel' ... – Mundi

+0

輸出是'UIColor'。我認爲你需要的是一個'CGColorRef'。嘗試直接指定'color.CGColor'而不是'color'。 –

+0

好的,那是一個單獨的問題......已經解決了一些問題。 - 宏有效,但performSelector是@ zoul的想法;-)。 – Mundi