为什么没有drawRect:被叫?

时间:2016-03-09 18:13:06

标签: objective-c cocoa nsview appkit nsscrollview

我有一个NSView子类foo,它会覆盖drawRect

- (void)drawRect:(NSRect)dirtyRect
{
    [self doStuff];
}

我原以为每当我添加我的类的实例bar作为另一个视图的子视图时,bar将被重绘。但是,当我在我的应用程序中添加bar作为主窗口的contentView时,我并没有看到这种情况。

我尝试添加另一个覆盖:

- (void)viewDidMoveToSuperview
{
    self.needsDisplay = YES;
}

...希望当bar获得超级视图时,它会使其显示无效并强制重绘。没有这样的运气(viewDidMoveToSuperview被调用,但不是drawRect:)。

我想我可能会误解drawRect:如何被调用,我承认我对绘图事件循环一般没有最好的理解。我无法在网上找到很多关于此的文档。

所以我的问题是双重的:1)在调用drawRect:方面我做错了什么? 2)是否有关于在可可中绘制UI的事件循环的相关在线文档?

修改

在我的UI链中,调用它的foo实例drawRect:有两个子视图:一个基本上是NSTextView的子类,其大小为它的内容,另一个是NSScrollView。由于运气的缘故,我碰巧注释掉了添加NSScrollView的代码,突然foo的实例再次调用drawRect

所以我NSScrollview以某种方式阻止我的foo接收drawRect:。通过Google快速搜索,我发现其他人报告了与绘图和NSScrollView相关的问题。但是,这些帖子中的大多数似乎都与 NSScrollView中的子视图相关,而不是NSScrollView的超级视图。

所以这是我最新的问题:我的NSScrollView实例阻止其父级接收drawRect:怎么办?

1 个答案:

答案 0 :(得分:-2)

您是否尝试调用[查看显示];而不是needsDiplay?