簡體   English   中英

在NSMenuItem中使用NSProgressIndicator

[英]Using NSProgressIndicator inside an NSMenuItem

我正在嘗試在狀態欄菜單中使用NSProgressIndicator(不確定)。 我正在使用NSView對象作為menuitem的視圖,然后查看進度指示器以顯示它。 但每當我嘗試調用startAnimation時:對於進度,沒有任何反應。 當我嘗試在普通的NSWindow上做同樣的事情時,它可以很好地工作,而不是在一個menuitem中。

我是cocoa和objective-c的新手,所以我可能會忽略一些“顯而易見的”但我已經搜索了很多但是沒有成功。 我發現一些關於menuitems的東西在顯示時無法更新,你需要使用無邊框窗口。 但我無法在任何文檔中證實這一點。

編輯:

好的,現在差不多了。 當使用setUsesThreadedAnimation:並從MenuDelegate的menuWillOpen中創建一個新線程。 該線程運行本地方法:

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

這將在打開菜單時以隨機(?)為基礎啟動progressindicator。 如果我直接調用startAnimation:而不通過doWork:仍然使用新線程),它永遠不會工作。 沒有setUsesThreadedAnimation:讓進度條為動畫創建自己的線程?

通過使用解決它:

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

在menuWillOpen:中,問題似乎是調用startAnimation:在進度條完成繪制之前。

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

另外,你在何時何地調用startAnimation: (我們需要看一些代碼)。

有時可能發生的一件事是你忘記在筆尖中連接一個IBOutlet 然后,當您嘗試告訴對象在運行時在代碼中執行某些操作時, IBOutlet nil ,因此您認為發送到對象的消息實際上是發送給nil的消息。 換句話說,它只是被忽略了,實際上看起來它不起作用。

如果您對UI對象有(可能)有效的引用,那么您將看到的另一個常見問題是當開發人員試圖在“太早”的時間向該對象發送消息時。 通常, init方法在控制器對象的生命周期中太早,無法向用戶界面對象發送消息 - 這些IBOutlet仍然是nil 在調用-awakeFromNibIBOutlet應該是有效的(假設您將它們連接到IB中),然后您可以將消息發送到UI對象。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM