2010-05-17 97 views
1

設置背景顏色的UIView我在視圖控制器下面的代碼:無法從視圖控制器

- (void)viewDidLoad { 
    [super viewDidLoad]; 
ThemeManager *themer = [ThemeManager sharedInstance]; 
UIView *theView = self.view; 
UIColor *forBackground = [themer backgroundColour]; 
[theView setBackgroundColor:forBackground]; 
} 

但是當執行獲取到setBackgroundColor線,我得到以下錯誤:

*** -[NSCFNumber CGColor]: unrecognized selector sent to instance 0x1237c40 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFNumber CGColor]: unrecognized selector sent to instance 0x1237c40' 

有一些簡單的事情我做錯了,我該如何設置背景顏色?

我必須繼承該視圖,並在那裏做?我不希望有額外的類,儘管這是更好地分離整個模型/視圖/控制器的東西。

更新:由[themer backgroundColour]返回的值是使用colorWithPatternImage:構造的,這可能會有所作爲嗎?

更新:如果我在使用colorWithRed構建的ThemeManager中使用了一個值:green:blue:alpha:,那它工作正常。有沒有辦法使用帶背景圖像的顏色來做到這一點?以下作品OK:

[theView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]]; 

更新:這個作品也沒關係:

UIColor *forBackground = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 
[theView setBackgroundColor:forBackground]; 

在我原來的例子,將對象從[themer backgroundColor]返回是一個UIColor,所以有什麼問題呢?

當我步驟通過與調試器:

UIColor *forBackground = [themer backgroundColour]; 

導致forBackground感型的NSConstantValueExpression *

UIColor *forBackground = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 

導致forBackground感型的UIDeviceRGBColor *

這裏是ThemeManager的backgroundColour方法的代碼:

- (UIColor *)backgroundColour { 
if (backgroundColour == nil) { 
    backgroundColour = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 
} 

return backgroundColour; 
} 

backgroundColour也是實例變量的名稱。

回答

2

的問題是,我沒有retainUIColorThemeManager中,所以它在第一個視圖上工作,但不在後面的視圖中。

ThemeManager新代碼:

backgroundColour = [[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]] retain]; 
0

看來,這條線返回無效的實例:

UIColor *forBackground = [themer backgroundColour]; 

錯誤說forBackgroundNSCFNumber類,而不是類UIColor類的預期。請檢查backgroundColour方法是否返回正確的類型。

更新:

有你的調試器這種方法檢查的backgroundColour價值?

- (UIColor *)backgroundColour { 
    if (backgroundColour == nil) { 
     backgroundColour = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]]; 
    } 
    return backgroundColour; 
} 

我懷疑在創建實例時backgroundColour未設置爲空。所以測試失敗,並且該方法返回一個隨機引用。

+0

調試器與含setBackgroundColor – Curyous 2010-05-17 09:31:44

+0

您打造的圖案顏色只有backgroundColour是零線的紅色箭頭停止。你確定backgroundColour是零嗎?如果您在創建顏色的線上放置斷點,調試器會停止嗎? – 2010-05-17 12:06:13

+0

好點,我已經將顏色生成代碼移動到了init方法中,無論如何它是一個更好的解決方案,儘管它不是這個問題的根本原因。 – Curyous 2010-05-18 10:06:14

0

我可能看起來好像他們返回的是一個數字而不是一種顏色,也許他們處理RGB十六進制值?我有時使用類方法+(UIColor *)getCustomColor:(CustomColorType)顏色構建customColor類;我一旦確定了應用程序的顏色主題,就可以使用該功能,但它也使您可以在一個地方更換顏色並隨時隨地改變顏色。我通常以0xFFFFFFFF值來做這件事,因爲這是大多數設計師處理顏色的方式。

這是 「複製 - 浪費」 從我的最後一個項目:

// 
// CustomColor.h 
// FC 
// 
// Created by RickiG on 12/19/09. 
// Copyright 2009 www.rickigregersen.com.. All rights reserved. 
// 

#import <Foundation/Foundation.h> 

typedef enum { 

    CustomColorWhiteText, 
    CustomColorDarkGreyText, 
    CustomColorLightGreyText, 
    CustomColorGreyText, 
    CustomColorLightBlueText, 
    CustomColorDarkWhiteText, 
    CustomColorLightWhiteText, 
    CustomColorLightPurpleText, 
    CustomColorOrange, 
    CustomColorRed, 
    CustomColorSilver, 

} CustomColorType; 

@interface CustomColor : NSObject { 

} 

+ (UIColor*) getCustomColor:(CustomColorType) color; 

@end 

和實現:

// 
// CustomColor.m 
// FC 
// 
// Created by RickiG on 12/19/09. 
// Copyright 2009 www.rickigregersen.com.. All rights reserved. 
// 

#import "CustomColor.h" 


@implementation CustomColor 

+ (UIColor*) getCustomColor:(CustomColorType) color { 

    int value; 

    switch (color) { 

     case CustomColorWhiteText: 
      value = 0xffffff; 
      break;   
     case CustomColorDarkGreyText: 
      value = 0x373737; 
      break; 
     case CustomColorGreyText: 
      value = 0x7a7a7a; 
      break; 
     case CustomColorLightGreyText: 
      value = 0xd3d3d3; 
      break;   
     case CustomColorLightBlueText: 
      value = 0x8ed6ff; 
      break; 
     case CustomColorDarkWhiteText: 
      value = 0x979797; 
      break; 
     case CustomColorLightWhiteText: 
      value = 0xe8e8e8; 
      break; 
     case CustomColorLightPurpleText: 
      value = 0xd17efc; 
      break; 
     case CustomColorOrange: 
      value = 0xfb8720; 
      break; 
     case CustomColorRed: 
      value = 0xeb0008; 
      break; 
     case CustomColorSilver: 
      value = 0xe3e3e3; 
      break; 

     default: 
      value = 0x000000; 
      break; 
    } 

    int r, g, b; 
    b = value & 0x0000FF; 
    g = ((value & 0x00FF00) >> 8); 
    r = ((value & 0xFF0000) >> 16); 

    return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]; 
} 

@end 

這樣我可以隨時去:

[UIView setBackgroundColor:[CustomColor getCustomColor:CustomColorWhiteText]; 

從任何地方在我的項目中。 我有相同類型的文件來處理通過應用程序重複使用的文本標籤,按鈕和其他界面元素。

希望它幫助,如果你正在構建應該能夠改變它的外觀上飛一個UI,即使它是你問的不完全是:)

相關問題