如何在最新的 SwiftUI App 中获取窗口或视图的所有子视图?

Posted

技术标签:

【中文标题】如何在最新的 SwiftUI App 中获取窗口或视图的所有子视图?【英文标题】:How to get all the subviews of a window or view in latest SwiftUI App? 【发布时间】:2019-08-19 10:08:19 【问题描述】:

有什么方法可以获取 UIView 的所有子视图,例如 SwiftUI 应用中的 [视图子视图]?

当我尝试查询时,它给了我“_TtCOCV7SwiftUI11DisplayList11ViewUpdater8Platform13CGDrawingView....”。我正在尝试获取所有文本字段、标签等。

【问题讨论】:

我会赞成你的问题,即使我认为答案是“不”。此外,请考虑UIKit/AppKitSwiftUI 之间的深度 差异。或者是什么使UIView/NSViewView 相比。作为完全不同的堆栈(驱动程序在前者中“拉”而在后者中“推”),感觉(对我来说)是这样的......如果你 re-frame 你的问题一种不同的方式 - 也许像 “这就是我想要的(以及为什么我需要获得完整的视图层次结构),我如何在 SwiftUI 中做到这一点” - 你可能会得到更好的答案来满足你的需求比你可能想要的那样。 【参考方案1】:

在大多数情况下,您不应该考虑在 SwiftUI 中“获取”视图。在 SwiftUI 中,您的视图是结构,您应该构建您的数据模型以“驱动”对视图的更改。

例如,如果您正在考虑禁用所有文本字段,则应考虑在数据模型中设置一个 bool 值,以“驱动”您的 SwiftUI 视图禁用或启用。如果您正在考虑以某种方式设置所有文本字段的样式,则应考虑将该样式信息存储在数据模型中,并在数据模型的值更改时对文本字段使用不同的视图修饰符。

话虽如此,您可以使用 UIKit 方法来获取 SwiftUI 层次结构中的所有视图,方法是将最顶层的 SwiftUI 视图包装在 UIHostingController 中。这样,您可以查询在后台渲染的一些 UIKit 视图。你可能并不总是得到你想要的视图,因为 SwiftUI 中只有一些视图是使用 UIView 和 NSView 等原生视图呈现的,而其他一些则不是。您可以使用 View Debugger 更详细地检查您的视图层次结构,以查看您可以查询哪些视图。

【讨论】:

以上是关于如何在最新的 SwiftUI App 中获取窗口或视图的所有子视图?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 中如何获取任意视图触摸位置(全局或局部)的坐标

SwiftUI 中如何获取任意视图触摸位置(全局或局部)的坐标

SwiftUI 让用户更便捷在 App Store 为 App 打分和评价的超详细介绍

SwiftUI 让用户更便捷在 App Store 为 App 打分和评价的超详细介绍

如何删除 macOS SwiftUI App 中的“新窗口”选项?

SwiftUI:如何在动态列表或 LazyVStack 中获取视图框架