![](/img/trans.png)
[英]NSProgressIndicator in NSMenuItem not updating on second display
[英]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
。 在調用-awakeFromNib
, IBOutlet
應該是有效的(假設您將它們連接到IB中),然后您可以將消息發送到UI對象。
你有沒有通過-setUsesThreadedAnimation告訴它使用線程動畫?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.