2012-06-12 45 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與普通方法不同,並且沒有正確地獲得類的範圍,但我該如何解決它?

乾杯 達明

回答

5

我有一種感覺的drawRect是不同的,正常的方法,並沒有正確

獲取類的範圍不,沒有什麼特別的-drawRect:

有兩種可能性:

1.您-init方法不會被調用。

您沒有說明如何創建此視圖 - 如果您手動調用[[DartBoard alloc] init],或者它是從nib文件取消存檔。

如果它來自於筆尖,UIView的取消存檔不知道您應該調用init方法。它會調用designated initializer,而不是-initWithFrame:

因此,您應該實施該方法,並確保調用超級!

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

2.有可能是您的視圖實例:一個,你是手動init ING,另一個是來自其他地方,可能是筆尖。第二種情況是正在繪製的。由於它的變量和屬性從未設置,它們顯示爲零(默認值)。

您可以將此行添加到-init-drawRect:方法中,以查看self的值是多少。 (或者,使用調試器檢查它。)

NSLog(@"self is %p", self); 
+0

也NSNumber的分配,而不是保留,它可能已經通過的drawRect –

+0

時自動釋放是的,這是另一個錯誤:你的財產應該使用'retain'或'copy',不指定' '。那個錯誤以後可能會導致崩潰,但這不是你問到的問題的根源。 –

+1

非常感謝很多傢伙......問題是我在筆尖有兩個實例,一個在代碼中刪除了筆尖中的一個,並且一切都很好......必須愛堆棧溢出...... –