关闭预览操作

问题描述 投票:0回答:3

我正在尝试解决预览中的 DismissAction 问题。 这是在视图中:letparentDismiss:DismissAction

这是我的预览版:

struct MilkingView_Previews: PreviewProvider {
    static var previews: some View {
        MilkingView(parentDismiss: DismissAction())
    }
}

但是我经常遇到错误'DismissAction'无法构造,因为它没有可访问的初始化器

DismissAction() 的帮助不如 DismissAction。

swiftui preview dismiss
3个回答
1
投票

如果您只需要提供一个功能,但不需要它实际执行任何操作,这应该足以进行预览构建:

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 的一部分。


0
投票

我不知道如何以正确的方式解决您的问题,但我正在使用一种解决方法,并且它对我有用。

所以,请耐心等待。

我有一个

.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
,因为我意识到预览代码在某些情况下会被编译,并且它会不必要地使应用程序膨胀。我用它来从最终代码中排除预览。 (我不知道这是否已修复,我没有时间或耐心去追求此类信息,但它不会破坏我的代码,所以我很高兴。)

这对我有用。尝试一下。


0
投票

对于遇到此问题的其他人。将结构中的关闭操作定义为静态属性。

@Environment(\.dismiss) static private var dismiss
© www.soinside.com 2019 - 2024. All rights reserved.