2011-07-18 61 views
0

我已經創建了一個UIView子類來實現一個自定義drawRect方法。通過在代碼中放置一些日誌,我發現drawRect實際上是在視圖首先由視圖控制器設置時調用兩次。爲什麼是這樣?iOS:爲什麼drawRect:被調用兩次,爲什麼這個ivar值看起來沒有任何理由變化?

另一個問題是我的UIView子類有一個名爲needsToDrawTools的ivar。我爲這個子類指定的初始化器將needsToDrawTools的值設置爲YES。 drawRect方法然後檢查這個值。如果是,則繪製工具,然後將needsToDrawTools的值設置爲NO,以便它不再重新繪製工具。

但是,不知何故,drawRect被調用時,needsToDrawTools的值是NO。在我的代碼中沒有任何地方將它設置爲NO,除了在drawRect中的if(needsToDrawTools)語句中。但是由於needsToDrawTools在達到if語句時已經不是NO,語句中的代碼甚至都不會運行。如果我完全刪除IF語句,那麼它當然會運行,並且我可以看到我期望的視圖。但我不想刪除IF語句,因爲這會導致重繪不需要重新繪製的東西。

這裏是我的代碼:

- (id)initWithParentViewController:(NewPhotoEditingViewController *)vc 
{ 
    self = [super init]; 
    if (self) { 
     parentVC = vc; 
     needsToDrawTools = YES; 
     NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 1 
    } 
    return self; 
} 

#pragma mark - Drawing 

- (void)drawRect:(CGRect)rect 
{ 
    NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 0 !!!!! 
    if (needsToDrawTools){ 
     NSLog(@"drawingTools"); //Never shows up in the console 
     UIBezierPath *toolPointDragger = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(75, 100, 30, 30)]; 

     [[UIColor blackColor] setStroke]; 
     toolPointDragger.lineWidth = 6; 
     [toolPointDragger stroke]; 

     [[UIColor blueColor] setFill]; 
     [toolPointDragger fill]; 
     needsToDrawTools = NO; 
    } 
} 

如此反覆,我的兩個問題是:

  1. 爲什麼drawRect中被調用兩次?我認爲它會自動作爲視圖加載過程的一部分自動調用,但我不知道爲什麼它會再次被調用。

  2. needsToDrawTools如何以NO值結束?

+2

你可能會嘗試在兩種方法中添加NSLog(@「Self is%p」,self)。這可能是你在這裏工作的幾個不同的例子。 needsToDrawTools對於新實例的默認值當然是NO。 –

回答

2

這聽起來像你有這個視圖的多個實例。也許你正在編程創建一個並從筆尖加載一個? Objective-C將在創建對象時將所有ivars設置爲零(或零,或NO),並且如果您從一個筆尖加載視圖的實例,則不會使用您的-(id)initWithParentViewController:needsToDrawTools進行初始化這個觀點沒有。

+0

是的,完全正確。從一個筆尖加載一個實例,並初始化我自己的程序。謝謝。 – maxedison

相關問題