2012-06-12 3 views
2

я видел какое-то странное поведение, когда я пытаюсь получить доступ к переменной класса, или свойство в моем методе DrawRect ..Свойство не установлено в методе DrawRect - IOS

В моей .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; class variables out of scope

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

Приветствия Damien

ответ

5

У меня есть чувство DrawRect отличается, что обычные методы и не получает объем класса правильно

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

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

1. Ваш метод -init не вызывается.

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

Если это исходит от наконечника, unarchiving UIView не знает, что ваш метод init должен быть вызван. Вместо этого он назовет designated initializer, а это -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); 
+0

также NSNumber назначается и не сохраняется, и возможно, что он был autoreleased по времени DrawRect –

+0

Да, это еще одна ошибка: ваша собственность должна использовать '' retain' или copy', а не 'назначить '. Эта ошибка может привести к сбою позже, но это не основная причина проблемы, о которой вы просили. –

+1

Блестяще спасибо большое, ребята ... Проблема была в том, что у меня было 2 экземпляра один в nib, а один в коде, я удалил тот, что был в nib, и все хорошо .. Получил удовольствие от переполнения стека ... –

Смежные вопросы