【问题标题】:What method actually got called when we set self.navigationItem.hidesBackButton = YES;当我们设置 self.navigationItem.hidesBackButton = YES; 时实际调用了什么方法;
【发布时间】:2015-05-13 03:16:18
【问题描述】:

我很好奇当我们设置self.navigationItem.hidesBackButton = YES/NO; 时实际调用了什么方法。我很好奇,因为 property 不是 method,当我们将实际在后台运行的任何值分配给任何值时,它可以立即隐藏或显示 Back Button。我一直在想有一个 Run Loop 可以不断检查这样的东西。

【问题讨论】:

  • 要回答标题中的问题,扩展为不使用点语法,该行是这样的:[[self navigationItem] setHidesBackButton: value]。但我相当肯定该方法实际上并没有进行任何重绘。这是在主运行循环的某个地方完成的。
  • 所有属性都是方法。为什么不这样说?

标签: ios uinavigationbar uinavigationitem runloop


【解决方案1】:

来自 Apple 文档

视图绘图周期 UIView 类使用按需绘制模型来呈现内容。当视图首次出现在屏幕上时,系统会要求它绘制其内容。系统捕获此内容的快照并将该快照用作视图的视觉表示。如果您从不更改视图的内容,则可能永远不会再次调用视图的绘制代码。快照图像用于大多数涉及视图的操作。如果您确实更改了内容,则会通知系统视图已更改。然后视图重复绘制视图并捕获新结果的快照的过程。

当您的视图内容发生更改时,您不会直接重绘这些更改。相反,您可以使用 setNeedsDisplay 或 setNeedsDisplayInRect: 方法使视图无效。这些方法告诉系统视图的内容发生了变化,下次有机会需要重新绘制。在启动任何绘图操作之前,系统会一直等到当前运行循环结束。此延迟使您有机会一次性使多个视图无效、从层次结构中添加或删除视图、隐藏视图、调整视图大小和重新定位视图。您所做的所有更改都会同时反映

所以,由于 UIKit 是基于 MVC 的,所以当你设置这个属性时,当前视图的模型会改变。

然后,在下一次运行循环中,视图重绘,然后你看它是否隐藏。

这个调用背后的方法是由iOS自动调用来重绘的,可能是一些私有的重绘方法。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2015-08-15
    • 2017-09-22
    • 1970-01-01
    相关资源
    最近更新 更多