2010-05-17 9 views
1

에서 UIView의 배경 색상을 설정할 수 없습니다 내가 가지고있는보기 컨트롤러에 다음 코드 :은의 ViewController

- (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 : green : blue : alpha :를 사용하여 만든 ThemeManager의 값을 사용하면 정상적으로 작동합니다. 배경 이미지가있는 색상을 사용하여이를 수행 할 수있는 방법이 있습니까? OK 다음 작품 :

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

업데이트 :이 확인도 작동합니다

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

을 내 원래의 예에서이 객체는 그래서 문제가 무엇을하는 UIColor했다 [themer backgroundColor]에서 반환? UIDeviceRGBColor *

여기 형 forBackground 존재 입력의 forBackground 존재 NSConstantValueExpression *

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

결과

UIColor *forBackground = [themer backgroundColour]; 

결과 : I는 디버거 단계별

ThemeManager의 backgroundColour 메서드 코드입니다.

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

return backgroundColour; 
} 

backgroundColour는 인스턴스 변수의 이름이기도합니다.

답변

2

물었다 정확히 무엇에도 불구하고, 당신이 즉시 외관의 변경 할 수 있어야 UI를 구축하는 경우 희망이 도움이 ThemeManager에서 첫 번째보기에서는 작동했지만 후속보기에서는 작동하지 않았습니다. ThemeManager에서

새로운 코드 :

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

이 라인이 잘못된 인스턴스를 반환 것으로 보인다 :

UIColor *forBackground = [themer backgroundColour]; 

오류가 forBackground 클래스 NSCFNumber이며 클래스가 아닌 UIColor 클래스의 예상대로 말한다. backgroundColour 메서드가 올바른 유형을 반환하는지 확인하십시오.

업데이트 :

는이 방법에 대한 디버거에서 backgroundColour의 값을 확인 했습니까?

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

인스턴스를 만들 때 backgroundColour이 null로 설정되지 않았다고 생각됩니다.따라서 테스트는 실패하고 메서드는 임의의 참조를 반환합니다.

+0

디버거 당신은 backgroundColour이 전무 경우에만 패턴 색상을 구축 setBackgroundColor – Curyous

+0

를 포함하는 라인의 빨간색 화살표가 중지됩니다. backgroundColour가 nil입니까? 색상을 만드는 줄에 중단 점을 넣으면 디버거가 멈 춥니 다? –

+0

좋은 점은, 색상 생성 코드를 init 메소드로 옮겼습니다. 비록이 문제의 근본 원인이 아니지만 더 나은 해결책입니다. – Curyous

0

테마가 색상 대신 숫자를 반환하는 것처럼 보일 수 있습니다. 테마가 RGB 16 진수 값을 처리하는 것 같습니까?

때로는 클래스 메서드 + (UIColor *) getCustomColor : (CustomColorType) 색상을 사용하여 customColor 클래스를 작성합니다. 일단 앱의 색상 테마가 결정되면 색상을 한 곳에서 변경할 수 있고 변경 사항을 모든 곳에서 즉시 적용 할 수 있다는 이점이 있습니다. 대부분의 디자이너가 색상을 처리하는 방식이므로 일반적으로 0xFFFFFFFF 값으로이 작업을 수행합니다. 난 항상 갈 수

// 
// 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]; 

// 
// 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 

및 구현 :

내 마지막 프로젝트에서 "복사가-낭비"입니다 내 프로젝트에서. 텍스트 라벨, 버튼 및 앱을 통해 다시 사용되는 다른 인터페이스 요소를 다루는 파일 유형이 동일합니다.

은 당신이 문제는 내가 UIColorretain하지 않았다 :)