2011-01-12 42 views
6

我試圖在狀態欄菜單中使用NSProgressIndicator(不確定)。我使用NSView對象作爲menuitem的視圖,然後子視圖顯示進度指示器。但是每當我嘗試調用startAnimation時:對於進度,沒有任何反應。當我嘗試在正常的NSWindow上做同樣的事情時,它完美地工作,而不是在菜單項內。在NSMenuItem中使用NSProgressIndicator

我對可可和objective-c都很陌生,所以我可能忽略了一些「顯而易見」的東西,但我已經搜索了很多方法,但沒有成功。我發現有些菜單項無法在顯示時進行更新,您需要使用無邊框窗口。但我無法在任何文檔中確認這一點。

編輯:

好了,幾乎現在的作品。當使用setUsesThreadedAnimation時:並從MenuDelegate的menuWillOpen中創建一個新的線程。這個線程運行的本地方法:

-(void) doWork(NSProgressIndicator*) p{ 
    [p startAnimation:self]; 
} 

打開菜單時,這將啓動一個隨機的基礎上progressindicator(?)。如果我直接撥打startAnimation:而不通過doWork:(仍在使用新線程),它將無法工作。 setUsesThreadedAnimation:是否使進度條創建它自己的動畫線程?

回答

16

通過解決它:

[progressIndicator performSelector:@selector(startAnimation:) 
          withObject:self 
          afterDelay:0.0 
           inModes:[NSArray 
         arrayWithObject:NSEventTrackingRunLoopMode]]; 

的menuWillOpen內幕:,這個問題似乎一直在呼籲startAnimation:進度條在完成繪製自己之前。

0

你有沒有告訴它通過-setUsesThreadedAnimation使用線程動畫?

+0

是的,似乎沒有幫助。 – Henrik 2011-01-13 09:54:28

1

你是如何引用視圖中的NSProgressIndicator(以及窗口中的那個)?例如,你是否有一個控制器類,其0123'與進度指示器相連接?如果您使用IBOutlet,您確定它已正確連接到筆尖文件中嗎?

此外,何時何地您打電話給startAnimation:? (我們需要看一些代碼)。

有時候可能會發生的一件事是,您忘記在筆尖上連接IBOutlet。然後,當您嘗試告訴對象在運行時在代碼中執行某些操作時,IBOutletnil,所以您認爲發送到您的對象的消息實際上是發送到nil的消息。換句話說,它只是被忽略,並且看起來好像不起作用。

如果您確實有對UI對象的(可能)有效的引用,那麼您將看到的另一個常見問題是開發人員在「太早」嘗試向該對象發送消息時。一般來說,init方法在控制器對象的生命週期中過早以至於無法將消息發送到用戶界面對象 - 那些IBOutlet仍然是nil。在調用-awakeFromNib時,IBOutlet應該是有效的(只要您將它們連接到IB),然後可以將消息發送到UI對象。

+0

好的一點,這就解釋了爲什麼我有時在嘗試接觸插座組件(過早稱呼它們)時確實存在無值。現在我似乎把它縮小到一個繪圖問題。當包含視圖的菜單項突出顯示時(在我的視圖的drawRect :)中,當它不再突出顯示時,將其設爲動畫。但是,如果我嘗試使if外部的if-clause檢查項目是否突出顯示沒有任何反應(仍在drawRect內:)。 – Henrik 2011-01-13 09:57:54

+0

我已經設法讓它工作得更多一些,似乎我必須發送stopAnimation:在開始動畫之前的某個時間:工作。但我希望它在顯示菜單時動畫(或不)。目前,我必須將鼠標懸停在視圖上才能啓動,當它們顯示菜單時,它只顯示進度條不動畫,即使它不應該隱藏(setDisplayWhenStopped:NO)。在下一條評論中繼續... – Henrik 2011-01-13 14:00:24