我正在尝试解决预览中的 DismissAction 问题。 这是在视图中:letparentDismiss:DismissAction
这是我的预览版:
struct MilkingView_Previews: PreviewProvider {
static var previews: some View {
MilkingView(parentDismiss: DismissAction())
}
}
但是我经常遇到错误'DismissAction'无法构造,因为它没有可访问的初始化器
DismissAction() 的帮助不如 DismissAction。
如果您只需要提供一个功能,但不需要它实际执行任何操作,这应该足以进行预览构建:
struct MilkingView_Previews: PreviewProvider {
static var previews: some View {
MilkingView(parentDismiss: {})
}
}
如果您这样做,您可以随时执行以下操作:
struct MilkingView_Previews: PreviewProvider {
static var previews: some View {
MilkingView(parentDismiss: {
print("Doing something...")
})
}
}
没有必要做更多的事情。它是一个预览提供程序,仅显示 UI 的一部分。
我不知道如何以正确的方式解决您的问题,但我正在使用一种解决方法,并且它对我有用。
所以,请耐心等待。
我有一个
.sheet
,可以看到里面的景色。该视图有一个 NavigationLink
项目列表,他们将在第三个视图中打开一个表单。从该表格中我应该能够关闭表格。
所以..
Main view > List (in a sheet) > Form (close from here)
所以在我的列表视图中我有这个:
@Environment(\.dismiss) var dismiss
// (...)
NavigationLink {
MyForm(something, dismissParent: dismiss)
} label: {
Text(title)
}
在我的表单视图上,它位于该列表中,我将我的解雇传递给初始化程序。 init 最初看起来像这样:
private var dismissParent: DismissAction
init(_ something, dismissParent: DismissAction) {
self.something = something
self.dismissParent = dismissParent
}
当然,这会破坏预览,因为您自己的代码。我所做的是将闭包作为回调传递。所以我修改了我的代码,如下所示:
private var dismissParent: () -> Void
init(_ something, dismissParent: @escaping () -> Void) {
self.something = something
self.dismissParent = dismissParent
}
在家长身上我得到了这个:
@Environment(\.dismiss) var dismiss
// (...)
NavigationLink {
MyForm(something) {
dismiss()
}
} label: {
Text(title)
}
在预览中我会这样做:
#if DEBUG
struct MyForm_Previews: PreviewProvider {
static var previews: some View {
ZStack {
MyForm(
dummySomething,
dismissParent: {}
)
}
}
}
#endif
我在那里使用
ZStack
,因为当我处理工作表中的视图时,由于某种原因预览似乎会中断很多。我不知道为什么,但这解决了它。
我还使用注释
#if DEBUG
和#endif
,因为我意识到预览代码在某些情况下会被编译,并且它会不必要地使应用程序膨胀。我用它来从最终代码中排除预览。 (我不知道这是否已修复,我没有时间或耐心去追求此类信息,但它不会破坏我的代码,所以我很高兴。)
这对我有用。尝试一下。
对于遇到此问题的其他人。将结构中的关闭操作定义为静态属性。
@Environment(\.dismiss) static private var dismiss