如何减少我的 SwiftUI ViewBuilder 布局?

Posted

技术标签:

【中文标题】如何减少我的 SwiftUI ViewBuilder 布局?【英文标题】:How do I reduce my SwiftUI ViewBuilder Layout? 【发布时间】:2021-03-24 22:55:27 【问题描述】:

场景:我已经编写了一个完整的 UISwift 应用程序。但是在 DEVICE 与 SIMULATOR 上运行时,我开始出现奇怪的行为:

尝试在其自己的 ZStack 层中显示视图时得到一个空白页;通过模拟器,它可以工作。

当我将其分解为一个简单的应用程序与我的大型应用程序时;它有效。

这让我怀疑 ViewBuilder 布局在幕后变得太大/复杂。

所以我在视图中添加了一个 debug() 以查看我所得到的镜像(删节):

ZStack<TupleView<(ModifiedContent<Group<_ConditionalContent<ModifiedContent<Image, _AspectRatioLayout>, Color>>, _FrameLayout>, _ConditionalContent<Optional<ModifiedContent<VStack<TupleView<(ModifiedContent<HStack<ModifiedContent<ModifiedContent<Color, _FrameLayout>, _OverlayModifier<ModifiedContent<HStack<TupleView<(Spacer, ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _PaddingLayout>, Spacer, ModifiedContent<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _PaddingLayout>,
 AddGestureModifier<_EndedGesture<TapGesture>>>)>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>>>, _PaddingLayout>, ModifiedContent<HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>, _PaddingLayout>, 
_BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>)>>, _FrameLayout>, Spacer, Optional<TupleView<(ModifiedContent<ModifiedContent<VStack<TupleView<(HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<Text>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, Spacer)>>, HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<Text>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, Spacer)>>, HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<Text>, 
_PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, Spacer)>>)>>, _PaddingLayout>, _EnvironmentKeyWritingModifier<Optional<Color>>>, Spacer)>>)>>, _HiddenModifier>>, VStack<TupleView<(ModifiedContent<HStack<ModifiedContent<ModifiedContent<Color, _FrameLayout>, _OverlayModifier<ModifiedContent<HStack<TupleView<(Spacer, ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _PaddingLayout>, Spacer, ModifiedContent<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _PaddingLayout>, AddGestureModifier<_EndedGesture<TapGesture>>>)>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>>>, _PaddingLayout>, ModifiedContent<HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>, _PaddingLayout>,
 _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>)>>, _FrameLayout>, Spacer, Optional<TupleView<(ModifiedContent<ModifiedContent<VStack<TupleView<(HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<Text>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, Spacer)>>, HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<Text>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, Spacer)>>, HStack<TupleView<(ModifiedContent<ModifiedContent<ModifiedContent<ModifiedContent<Button<Text>, _PaddingLayout>, _BackgroundModifier<Color>>, _ClipEffect<RoundedRectangle>>, _ShadowEffect>, Spacer)>>)>>, _PaddingLayout>, _EnvironmentKeyWritingModifier<Optional<Color>>>, Spacer)>>)>>>, GlobalMembers)>>
    ZStack<TupleView<(ModifiedContent<Group<_ConditionalContent<ModifiedContent
<Image, _AspectRatioLayout>, Color>>, _FrameLayout>, _ConditionalContent<Optional<ModifiedContent<VStack<TupleView<(ModifiedContent<HStack<ModifiedContent<ModifiedContent<Color, _FrameLayout>, _OverlayModifier<ModifiedContent<HStack<TupleView<(Spacer, ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _PaddingLayout>, Spacer, ModifiedContent<ModifiedContent<ModifiedContent<Text, _EnvironmentKeyWritingModifier<Optional<Font>>>, _PaddingLayout>, AddGestureModifier<_EndedGesture<TapGesture>>>)>>, _EnvironmentKeyWritingModifier<Optional<Color>>>>>>, _PaddingLayout>, ModifiedContent<HStack<TupleView

这可能是正确的,但我无法解释:

    为什么当代码变大而不是小型测试应用程序时,我无法显示视图以及 为什么这在模拟器中有效,但在设备上无效。

我的大脑暂时是空白的。 我该如何清理这个烂摊子,或者这样可以吗? 有一个命令可以将其减少到几行。 它逃脱了我。

【问题讨论】:

ViewBuilder 的未镜像代码在哪里 这是我的整个项目,由选项卡视图、选择器等组成。每个选项卡视图都有一个 ZStack 的其他视图,这些视图根据上下文切换。我也有一些线性图。 我不确定您希望如何调试它。这“不应该”发生。我不知道 - 尝试通过用AnyView 包装一些视图来分解它,看看会发生什么。但除此之外,我认为可以提供的东西不多(很高兴错了)。 这真是令人沮丧。它在模拟中运行良好,但在设备上出现故障。模拟器和设备有什么区别?我认为模拟器将是第一个去的。如果以前发生过类似的事情,我将不得不研究苹果。 【参考方案1】:

我正在使用有问题的 iPhone 6s Plus。 我使用的是 iPhone 8 Plus 作为模拟器。

所以我尝试了 iPhone 6s Plus SIMULATOR 并遇到了与相应设备相同的问题。

显然,我需要一个更现代的设备来支持最新的 SwiftUI/Combine 框架。

【讨论】:

以上是关于如何减少我的 SwiftUI ViewBuilder 布局?的主要内容,如果未能解决你的问题,请参考以下文章

具有 minimumscaleFactor 的 SwiftUI 文本始终减少文本

SwiftUI - 如何在我的视图中调用函数?

如何将我的自定义 ButtonStyle 添加到 swiftui3 中的快捷方式 swiftui .buttonstyle() 属性

如何使我的 SwiftUI 网格视图正常工作?

如何使用 SwiftUI 将我的按钮粘贴到视图底部?

SwiftUI:如何使通知交互更改为我的视图的一部分?