我有一個NSPopover
內的自定義視圖。它應該根據用戶輸入進行更改,並且在用戶第一次與其交互時進行更改,但無法重繪以下時間。NSView只在斷點重繪
我試圖把NSLog
放在-drawRect:
方法中,並且在正常執行過程中它不會被調用。當我嘗試調試並在方法內部放置一個斷點時,它會正常調用,並且應用程序按其應有的方式工作。
我每次需要重繪時都明確地調用視圖-setNeedsDisplay:
方法。 我不明白爲什麼它應該有所作爲。
下面是更新視圖狀態的代碼。這些方法是NSTextField
委託方法-textDidChange:
的一部分,我檢查了每次用戶在與彈出窗口相關聯的文本字段中輸入內容時都會調用這些方法。
[tokenCloud tokensToHighlight:[NSArray arrayWithObject:completeSuggestionString]];
tokenCloud.tokens = filteredTokens;
[tokenCloud setNeedsDisplay:YES];
該意見是一系列隱藏按鈕。第一行更新彈出窗口中的所有按鈕以及第二個添加或刪除按鈕的狀態。他們都正常工作,因爲他們第一次被稱爲視圖正確更新。我還檢查了tokenCloud
中按鈕的狀態及其屬性tokens
的狀態是否正確更新。問題是NSView
子類tokenCloud
不會重繪,因此更改不會在第二次在UI中反映出來。
這裏是視圖的繪製方法:
- (void)drawRect:(NSRect)rect {
[self recalculateButtonLocations];
NSLog(@"Redrawn");
}
再次調用此方法通常每次如果我把一個斷點在[self recalculateButtonLocations];
我更新視圖。如果我讓應用程序正常運行,則第二次更新視圖時,控制檯中沒有任何記錄。如果我在recalculateButtonLocations
方法中包含NSLog
,同樣的事情,第二次沒有任何記錄意味着該方法未被調用。
bbum您可以添加表現出的問題最少的代碼例子嗎? – pqnet
我的歉意。我編輯了帖子並添加了代碼。 – Jacopo
由於它是一個自定義視圖,因此在調用'super'之前嘗試覆蓋'setNeedsDisplay'以包含日誌。 – pqnet