Свойство не задано в методе drawRect — iOS

Я наблюдаю какое-то странное поведение, когда пытаюсь получить доступ к переменной класса или свойству в моем методе drawRect.

В моем файле .h у меня есть следующее

@interface DartBoard : UIView
{
    Board * board;
    int index;
}
@property (readwrite, assign, nonatomic) NSNumber * selectedIndex;
@end

В моем файле .m у меня есть следующее

@implementation DartBoard

@synthesize selectedIndex;

-(id)init
{
    self.selectedIndex = [NSNumber numberWithInt:5];
    index = 123;
    return self;
}

- (void)drawRect:(CGRect)rect {
    NSLog(@"selectedIndex: %d",[self.selectedIndex intValue]);
    NSLog(@"index: %d",index);
}

@end

вывод

2012-06-12 19:48:42.579 App [3690:707] selectedIndex: 0
2012-06-12 19:48:42.580 App [3690:707] index: 0

Я пытался найти решение, но не повезло..

Я нашел похожий вопрос, но реального ответа на этот вопрос не было

См.: UIView drawRect; переменные класса вне области видимости

У меня такое чувство, что drawRect отличается от обычных методов и неправильно определяет область действия класса, но как мне это исправить?

Привет Дэмиен


person damien murphy.    schedule 12.06.2012    source источник


Ответы (1)


У меня такое чувство, что drawRect отличается от обычных методов и неправильно определяет область действия класса.

Нет, в -drawRect: нет ничего особенного.

Есть две возможности:

<сильный>1. Ваш метод -init не вызывается.

Вы не сказали, как создается это представление - если вы вручную вызываете [[DartBoard alloc] init] или если оно разархивируется из файла пера.

Если это исходит от пера, разархивирование UIView не знает, что должен быть вызван ваш метод init. Он вызовет назначенный инициализатор. вместо этого -initWithFrame:.

Таким образом, вы должны вместо этого реализовать этот метод и обязательно вызывать super!

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.selectedIndex = [NSNumber numberWithInt:5];
        index = 123;
    }
    return self;
}

<сильный>2. У вашего представления может быть два экземпляра: один вы init создаете вручную, а другой приходит откуда-то еще, возможно, из пера. Второй экземпляр - это тот, который рисуется. Поскольку его переменные и свойства никогда не устанавливаются, они отображаются как нулевые (значение по умолчанию).

Вы можете добавить эту строку к своим методам -init и -drawRect:, чтобы увидеть значение self. (Или проверьте это с помощью отладчика.)

NSLog(@"self is %p", self);
person Kurt Revis    schedule 12.06.2012
comment
также NSNumber назначается и не сохраняется, и возможно, что он был автоматически выпущен к моменту отрисовки. - person Omar Abdelhafith; 12.06.2012
comment
Да, это еще одна ошибка: ваш ресурс должен использовать retain или copy, а не assign. Эта ошибка может позже вызвать сбой, но она не является основной причиной проблемы, о которой вы спрашивали. - person Kurt Revis; 12.06.2012
comment
Великолепно, большое спасибо, ребята... Проблема была в том, что у меня было 2 экземпляра, один в пера и один в коде, я удалил один в пера, и все в порядке.. Мне понравилось переполнение стека... - person damien murphy.; 13.06.2012