被拆掉的 NSHostingView 还会再建一次 View
最近 Prowl 里出了一个有点诡异的 bug:切换到 Canvas 视图时,进入前选中的那个 tab,它在 Canvas 上对应的卡片是一片空白。其他卡片都好好的,切回 Default 或者 Shelf 视图,那个终端也完全正常,里面的 agent 该干嘛还在干嘛。只是 Canvas 上那一格,什么都画不出来。 最后的修复只有几行代码,但排查过程比预想中麻烦得多。尤其是中间发现了一件我之前完全没意识到的事:SwiftUI 居然会在一个 view 已经被 dismantle 之后,又去调用它下面的 makeNSView。这直接给人干懵了…甚至我第一次实际看到日志的时候,还以为是自己打错了。 最后踩到的根源是 SwiftUI 和 AppKit 混用时的一个生命周期问题,这里把排查过程记一下。 Surface 和它的宿主 先简单介绍一下 Prowl 里终端是怎么显示的。每个终端 pane 背后是一个 GhosttySurfaceView,它是一个长寿的 NSView,持有 Ghostty 的 surface 和背后的 shell 进程。用户在不同视图之间切换时,这个 view...
参与讨论