Установка shadowColor с синтаксисом свойства дает ошибку компилятора: ожидаемый идентификатор перед токеном '['

У меня есть приложение для iPad, в котором я устанавливаю цвет тени UILabel в методе initWithFrame: UIView. Когда я использую следующий синтаксис:

m_label.shadowColor = [UIColor colorWithWhite:1.0 alpha:0.5];

Я получаю эту ошибку компилятора:

Ожидаемый идентификатор перед токеном '['

Однако, когда я использую следующий синтаксис:

[m_label setShadowColor:[UIColor colorWithWhite:1.0 alpha:0.5]];

Собирается без нареканий.

Использование синтаксиса свойств для других свойств UILabel работает нормально (shadowOffset, autoresizingMask, backgroundColor, font, textColor и т. д.).

Между прочим, я получаю то же сообщение об ошибке, когда оператор просто такой:

m_label.shadowColor;

Принимая во внимание, что это, например, не дает ошибки:

m_label.shadowOffset;

FWIW, весь метод выглядит так:

#define shadowColor        [UIColor colorWithWhite:1.00 alpha:0.5]
#define selectedColor      [UIColor colorWithWhite:0.25 alpha:1.0]
#define unselectedColor    [UIColor colorWithWhite:0.45 alpha:1.0]
#define CLOSEBUTTON_WIDTH  26.0
#define CLOSEBUTTON_HEIGHT 26.0

- (id)initWithFrame:(CGRect)frame 
{
    if ((self = [super initWithFrame:frame])) 
    {
        m_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.frame.size.width, self.frame.size.height)];
        m_imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        m_imageView.backgroundColor = [UIColor clearColor];
        m_imageView.image = [[UIImage imageNamed:@"tab.png"] stretchableImageWithLeftCapWidth:8.0 topCapHeight:0.0];
        m_imageView.highlightedImage = [[UIImage imageNamed:@"tabSelected.png"] stretchableImageWithLeftCapWidth:8.0 topCapHeight:0.0];

        m_label = [[UILabel alloc] initWithFrame:CGRectZero];
        m_label.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        m_label.backgroundColor = [UIColor clearColor];
        m_label.font = [UIFont boldSystemFontOfSize:12.0];
        m_label.textColor = unselectedColor;
        m_label.shadowOffset = CGSizeMake(0.0, 1.0);
        m_label.shadowColor = shadowColor; // Expected identifier before '[' token
        [m_label setShadowColor:shadowColor];

        m_closeButton = [[UIButton alloc] initWithFrame:CGRectMake(9.0, 1.0, CLOSEBUTTON_WIDTH, CLOSEBUTTON_HEIGHT)];
        [m_closeButton setBackgroundImage:[UIImage imageNamed:@"tabClose.png"] forState:UIControlStateNormal];
        [m_closeButton addTarget:self action:@selector(closeTab) forControlEvents:UIControlEventTouchUpInside];

        [self addSubview:m_imageView];
        [self addSubview:m_label];
        [self addSubview:m_closeButton];

        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

Любые идеи?


person sam    schedule 27.04.2010    source источник


Ответы (4)


#define shadowColor        [UIColor colorWithWhite:1.00 alpha:0.5]

расширяется с обеих сторон задания.

m_label.shadowColor = shadowColor;

оценивается как:

m_label.[UIColor colorWithWhite:1.00 alpha:0.5] = [UIColor colorWithWhite:1.00 alpha:0.5];

что вызывает ошибку компилятора. Используйте другое имя для #define:

#define SHADOW_COLOR        [UIColor colorWithWhite:1.00 alpha:0.5]

m_label.shadowColor = SHADOW_COLOR;
person Jason DeFontes    schedule 30.04.2010
comment
Джейсон -- не могу поверить, что пропустил это. Это почти наверняка проблема исходного плаката. +1 для вас. - person Dennis Munsie; 30.04.2010

Две вещи - вам нужно добавить в файл следующее:

#import <QuartzCore/QuartzCore.h>

Во-вторых, вы используете CGColorRef как shadowColor, поэтому вы должны сделать что-то вроде этого:

m_label.layer.shadowColor = [[UIColor colorWithWhite:1.0 alpha:0.5] CGColor];

person Dennis Munsie    schedule 29.04.2010
comment
Спасибо за ответ, но это не решает. Я не уверен, при чем здесь Quartz, а свойство shadowColor — это UIColor, а не CGColor. - person sam; 30.04.2010
comment
Я вижу здесь проблему — Apple использует UIColor для атрибута shadowColor в UILabel, но они используют CGColorRef для shadowColor в CALayer. Мой код предназначался для использования атрибута слоя непосредственно в любом UIView, а не конкретно для UILabel shadowColor. - person Dennis Munsie; 30.04.2010

Пытаясь ответить на первоначальный вопрос теперь, когда я понимаю его немного лучше, похоже, что вы каким-то образом не включаете <UIKit/UILabel.h>. Он уже должен быть включен через <UIKit/UIKit.h> в ваш предварительно скомпилированный заголовочный файл для вашего проекта.

Используете ли вы выпущенный SDK 3.2, а не одну из предварительных версий или текущую бета-версию 4.0? Если нет, убедитесь, что вы используете правильный SDK. Также убедитесь, что с вашим файлом .pch для вашего проекта ничего не случилось. У вас должен быть #import для <UIKit/UIKit.h>.

Я только что протестировал SDK 3.2 в своем собственном проекте - я могу использовать свойство shadowColor в UILabel без ошибки, которую вы видите. Так что, похоже, что-то сломалось с вашей стороны.

person Dennis Munsie    schedule 30.04.2010

Убедитесь, что m_label правильно введено в вашем интерфейсе (то есть его класс UILabel). Синтаксис свойства-точки не работает, если компилятор использует неправильный тип, но динамическая природа Objective-C позволит вам отправлять сообщения объектам, которые могут не отвечать на них (и также должны выдавать предупреждение в этом случае) . Вот почему -setShadowColor: работает.

person jbrennan    schedule 30.04.2010