如何在没有 NSViewController 的情况下实现 `viewDidAppear`?

How to implement `viewDidAppear` without NSViewController?

NSViewController 中有一个名为 viewDidAppear 的方法。文档说:

This method is called after the completion of any drawing and animations involved in the initial appearance of the view.

如果没有 NSViewController class,并且您手动管理 NSView 对象树,您如何实现类似的东西?我看不到订阅“已出现”事件或有关 NSView.

的通知的方法

I don't see a way to subscribe to an "appeared" event or notification about an NSView.

没有,因为如果您的视图不由 NSViewController 管理,那么它就不会参与 NSViewController 生命周期。

如果您想手动跟踪您的视图何时“出现”,那么您需要确定“出现”在您的 use-case.

上下文中的含义。

对于初始外观,您需要查看:

  • NSView.viewDidMoveToWindow
  • NSView.viewDidMoveToSuperview

对于短暂的外观,您需要查看:

  • NSView.viewDidHide
  • NSView.viewDidUnhide

您可能还想查询适当的属性:

  • NSView.hidden
  • NSView.hiddenOrHasHiddenAncestor

如果你在意parentwindow的“外貌”,那么考虑一下:

  • 各种 NSWindow...Notification 通知,因为其中有很多与 window 的可见性或“隐藏”有关。

如果您在 sheet 或某种其他类型的模态容器中显示视图,那么我建议首先使用 NSViewController 实现它,然后在 [=20] 上设置断点=].回溯将向您显示之前调用了哪些方法,您可以只选择一个足够高的调用堆栈来满足您的 use-case.

我在一些应用程序中大量使用 NSViews 而没有视图控制器。在大多数情况下,我只是在初始化程序中设置视图,因为我很少会创建视图但不会立即出现。

如果视图正在执行接收通知、运行 动画或持续重绘等操作,并且您想根据视图的可见性启动或停止这些操作,那么只需覆盖适当的 NSView 方法以上。

但是,我发现如果我发现自己在使用该模式,那么很有可能该视图所做的比它应该做的更多,我将该代码提取到其他 class我可以独立于视图的可见性明确地开始和停止。 YMMV...