setNeedsDisplay:NO 有啥用吗?

Posted

技术标签:

【中文标题】setNeedsDisplay:NO 有啥用吗?【英文标题】:Does setNeedsDisplay:NO have any use at all?setNeedsDisplay:NO 有什么用吗? 【发布时间】:2012-09-25 14:48:32 【问题描述】:

在 Cocoa 中,当我们想要重绘视图时,我们会向视图发送setNeedsDisplay: 消息,告诉视图重绘自身,并带有 YES 参数。我想知道是否在任何情况下您想要发送视图setNeedsDisplay:NO,例如多线程环境,如果发送视图setNeedsDisplay:YES,那么在使用setNeedsDisplay:NO 之后立即再次设置会使视图重绘本身。如果没有理由调用setNeedsDisplay:NO,那么为什么要创建这样一个乏味的方法,他们可以在其中实现类似[view redrawView] 的东西

【问题讨论】:

【参考方案1】:

setNeedsDisplay:NO 可以用于如果您想丢弃以前调用的setNeedsDisplay:YES。例如。有时将所有子视图标记为需要显示,然后运行算法取消标记其中一些会更容易。

【讨论】:

【参考方案2】:

您可能知道,每次通过正常事件循环时,显示更新都是自动的(如果需要)。如果有必要,您可以调用setNeedsDisplay: 来强制在两者之间进行显示更新。

来自NSView的文档:

讨论 每当用于绘制视图对象的数据或状态发生变化时,应该向视图发送 setNeedsDisplay: 消息。标记为需要显示的 NSView 对象在每次通过应用程序的事件循环时自动重新显示。 (当然,在事件循环到来之前需要重新显示的视图对象可以立即被发送到适当的 display... 方法。)

该函数的布尔参数只是指定是否整个视图的边界 受到影响,而不是某些属性“needsDisplay”设置为真或假。因此,setNeedsDisplay: 确实很像“redrawView”,只是使用了附加参数。

编辑

以上内容的灵感来自相同的文档:

标志 如果是,则将接收者的整个边界标记为需要显示;如果否,则将其标记为不需要显示。

【讨论】:

这在很大程度上是不正确的。事件循环检查是否需要重绘视图,由调用setNeedsDisplay: 确定(它确实设置了一个标志:-[NSView needsDisplay])。该方法绝对不会导致立即重绘,也不一定在每次通过时都重绘每个视图。您提到的强制绘制行为由-[NSView display]-[NSView displayRect:] 提供。见developer.apple.com/library/mac/documentation/Cocoa/Conceptual/… 很公平。我编辑了我的答案并解释了信息的来源。 @Mundi 不幸的是,这并不能完全回答我的问题。请问setNeedsDisplay:NO有没有用处。

以上是关于setNeedsDisplay:NO 有啥用吗?的主要内容,如果未能解决你的问题,请参考以下文章

对 const 的右值引用有啥用吗?

带有数组的 unique_ptr 有啥用吗?

带有数组的 unique_ptr 有啥用吗?

Ruby:没有块的选择/查找有啥用吗?

default_if_none 在 Django 模板中有啥用吗?

JAVA中.class文件是啥意思?有啥用吗?