【发布时间】:2015-08-09 02:38:04
【问题描述】:
我在 NSPopover 中有一个自定义视图。它应该根据用户输入进行更改,并且它会在用户第一次与其交互时进行,但在以下时间重绘失败。
我尝试将NSLog 放入-drawRect: 方法中,但在正常执行期间它不会被调用。当我尝试调试并在方法中放置断点时,它会正常调用并且应用程序可以正常工作。
每次需要重绘时,我都会显式调用视图-setNeedsDisplay: 方法。
我不明白为什么它应该有所作为。
这是更新视图状态的代码。这些方法是NSTextField 委托方法-textDidChange: 的一部分,我检查了每次用户在与弹出框关联的文本字段中键入内容时都会调用这些方法。
[tokenCloud tokensToHighlight:[NSArray arrayWithObject:completeSuggestionString]];
tokenCloud.tokens = filteredTokens;
[tokenCloud setNeedsDisplay:YES];
视图是一系列凹进的按钮。第一行更新弹出框中所有按钮的状态,第二行更新添加或删除按钮。它们都可以正常工作,因为第一次调用视图时会正确更新。我还检查了tokenCloud 中按钮的状态及其属性tokens 是否已正确更新。问题是NSView 子类tokenCloud 不会重绘,因此更改不会第二次反映在 UI 中。
这里是视图的draw方法:
- (void)drawRect:(NSRect)rect {
[self recalculateButtonLocations];
NSLog(@"Redrawn");
}
如果我在[self recalculateButtonLocations]; 中放置断点,则每次更新视图时都会正常调用此方法。相反,如果我让应用程序正常运行,那么在我第二次更新视图时,控制台中不会记录任何内容。如果我在 recalculateButtonLocations 方法中包含 NSLog 也是一样,第二次没有记录任何内容,这意味着该方法未被调用。
【问题讨论】:
-
你能添加一个显示问题的最小代码示例吗?
-
我很抱歉。我编辑了帖子并添加了代码。
-
因为它是自定义视图,请尝试覆盖
setNeedsDisplay以便在调用super之前包含日志。 -
我无法重现该错误 - 它对我来说很好。我假设 tokenCloud 是您放置在 NSPopover 中的自定义视图,它也是文本字段委托
标签: objective-c macos cocoa