2010-07-14 54 views
0

我正在處理一個拖放視圖,並發現了一些處理器,用於在網絡上拖放操作。我想讓它變成藍色,當用戶在拖放區域上拖動文件時,它們在退出拖放區域時再次變爲灰色。問題在於,當您將鼠標拖到它上面或退出時,它不會更新。下面有一些代碼:NSView不更新?

- (void)drawRect:(NSRect)rect 
{ 
    NSRect bounds = [self bounds]; 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:bounds]; 
} 

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    NSRect bounds = [self bounds]; 
    [[NSColor blueColor] set]; 
    [NSBezierPath fillRect:bounds]; 

    return NSDragOperationCopy; 

}

- (void)draggingExited:(id <NSDraggingInfo>)sender { 
    NSRect bounds = [self bounds]; 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:bounds]; 

}

感謝您的幫助。

回答

1

僅繪製時的上下文(像油畫畫布)設置爲你畫成的作品。當框架調用-drawRect:時,它爲您設置了一個繪圖環境,因此繪圖命令如-[NSColor set]-[NSBezierPath fillRect:]按照您的預期工作。

-drawRect:外面有一般設置沒有繪圖上下文。使用-drawRect:之外的繪圖命令就像在空中揮動畫筆;沒有畫布,所以沒有繪畫發生。

在99.99%的情況下,所有視圖圖紙都應該保留在-drawRect:之內,因爲NSView執行了許多工作,您不希望這樣做可以正確高效地設置圖形上下文。

那麼,你如何你-draggingEntered:-draggingExited:方法中改變你的觀點的圖紙?由副作用。

你在所有三種情況下都做同樣的事情:1)設置顏色和2)繪製一個矩形。唯一的區別是每種方法的顏色變化。那麼,爲什麼不控制你-drawRect:使用哪種顏色與伊娃,像這樣:在-drawRect:

- (void)draggingEntered:(id <NSDraggingInfo>)sender { 
    drawBlueColorIvar = YES; 
    // ... 
} 

然後你做到這一點。

- (void)drawRect:(NSRect)rect { 
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor]; 
    [color set]; 
    [NSBezierPath fillRect:rect]; 
} 

(請注意,我沒有用[self bounds]這是更有效地只畫成「髒」的矩形,在可能的情況。)

最後,你需要一些方法來告訴你的視圖需要重繪drawBlueColorIvar變化時的框架。除非被告知需要,否則該框架不會提取任何東西。正如克里斯庫珀所說,你用[self setNeedsDisplay:YES]來做這件事。這應該在任何你改變的地方drawBlueColorIvar之後。

+0

我對可可還是有點新鮮,並沒有聽說過伊娃。當我嘗試編譯時,出現錯誤:'drawBlueColorIvar'未聲明(首次在此函數中使用),這似乎是合乎邏輯的,因爲我沒有聲明它。我如何申報伊娃? – nosedive25 2010-07-14 17:23:23

+0

哦,我知道了我只是添加NSColor * drawBlueColorIvar;到視圖標題。感謝所有的幫助! – nosedive25 2010-07-14 17:29:07

2

您是否在任何地方撥打[yourView: setNeedsDisplay]

這就是你如何讓繪圖框架知道它需要用drawRect:給你的UIView子類發信息,所以你應該在事情​​發生變化時去做。在你的情況下,這可能意味着當鼠標進入或退出放置區時。

+0

我加了[self setNeedsDisplay:YES];在每張圖紙之後,但沒有運氣。向它添加一個nslog表明這些方法正在被觸發。 – nosedive25 2010-07-14 03:06:28