我在NSPopover
. 它应该根据用户输入进行更改,并且它会在用户第一次与之交互时进行,但在以下时间重绘失败。
我试图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];
. 相反,如果我让应用程序正常运行,那么在我第二次更新视图时,控制台中不会记录任何内容。如果我NSLog
在recalculateButtonLocations
方法中包含同样的事情,第二次没有记录任何内容,这意味着没有调用该方法。