Не могу установить цвет фона для UIView из ViewController - PullRequest
1 голос
/ 17 мая 2010

У меня есть следующий код в контроллере вида:

- (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:, может ли это иметь значение?

Обновление: если я использую значение в своем ThemeManager, которое было создано с использованием colorWithRed: green: blue: alpha :, это работает нормально. Есть ли способ сделать это, используя цвет с фоновым изображением? Следующие работы в порядке:

[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 *

Вот код для метода backgroundColour ThemeManager:

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

 return backgroundColour;
}

backgroundColour также является именем переменной экземпляра.

Ответы [ 3 ]

2 голосов
/ 18 мая 2010

Проблема была в том, что я не retain UIColor в ThemeManager, поэтому он работал при первом просмотре, но не при последующих.

Новый код в ThemeManager:

backgroundColour = [[UIColor colorWithPatternImage:[UIImage imageNamed:@"myimage.png"]] retain];
0 голосов
/ 17 мая 2010

Мне может показаться, что themer возвращает число вместо цвета, может, themer имеет дело с шестнадцатеричными значениями RGB?

Иногда я создаю класс customColor с помощью метода класса + (UIColor *) getCustomColor: (CustomColorType) color; который я использую после определения цветовой темы приложения, оно также дает вам возможность изменять цвета в одном месте и мгновенно менять их везде. Я обычно делаю это в значениях 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];

Из любого места в моем проекте. У меня есть файл того же типа для работы с текстовыми метками, кнопками и другими элементами интерфейса, которые повторно используются в приложении.

Надеюсь, это поможет, если вы создаете пользовательский интерфейс, который должен иметь возможность изменять его внешний вид на лету, даже если это не совсем то, что вы просили :)

0 голосов
/ 17 мая 2010

Кажется, что эта строка возвращает недопустимый экземпляр:

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 при создании экземпляра. Таким образом, тест не пройден, и метод возвращает случайную ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...