【问题标题】:Stop Alert Refreshing the whole view停止警报刷新整个视图
【发布时间】:2021-08-25 18:33:33
【问题描述】:

我有一个 SwiftUI 视图,我想显示一个显示附加信息的警报,但是问题是当警报被解除时,它会刷新整个视图并将用户导航回根视图(因为状态解除警报时变量 showFutherInfo 发生变化)。我不希望这种情况发生。

一个非常简化的代码版本如下所示:

struct PledgesView: View {
    @State var showFurtherInfo :Bool = false
    var body: some View {
        VStack{

                        Button(action: {
                            
                            showFurtherInfo = true

                              }) {
                            Image(systemName: "figure.walk").renderingMode(.original)
                                .resizable()
                                .frame(width: 50, height: 50, alignment: .center)
                               
                        }
                        .alert(isPresented:$showFurtherInfo) {
                            Alert(
                                title: Text("Important message"),
                                message: Text("Important Info"),
                                dismissButton: .default(Text("Dismiss"))
                            )
                        }
}
             

我想在警报时停止这种令人耳目一新的行为,拜托。基本上我只需要帮助解耦控制正在显示的警报的变量,从这个视图

【问题讨论】:

  • 你能加入minimal reproducible example吗?如果没有您的自定义类型,任何人都无法复制/粘贴和测试此代码。
  • 现在已经完成了
  • 这个例子没有演示“导航[ing]用户回到根视图”——它只是一个视图。
  • 肯定还有更多事情要做。我可以用NavigationViewNavigationLink 编写一个示例,并用Alert 编写一个 表现出这种行为的子视图(我刚刚在Xcode 中尝试过)。因此,您的代码中肯定发生了一些不同的事情。如果你为了一个最小的、可重复的例子而减少你的代码,没有人会因为“代码太多”而关闭这个问题。
  • 你可以,但这里的用户通常不会善意地看待它。您可能应该做的是将您的代码复制到一个新项目(或创建一个分支),然后削减代码,直到您仅能提出问题,然后在此处提交。当然,这会涉及一些工作,但在此过程中,您可能会发现解决您自己问题的方法,这是完成该过程的另一个价值。

标签: swift swiftui


【解决方案1】:

为避免刷新,您必须将所有内容(您不想被刷新)移动到单独的视图中。渲染引擎将看到视图不依赖于修改后的状态并且不会重新渲染它。

即。就像

OtherView()     // << move everything inside !!
 .alert(isPresented:$showFurtherInfo) {
    Alert(
        title: Text("Important message"),
        message: Text("Important Info"),
        dismissButton: .default(Text("Dismiss"))
    )
 }

注意:OtherView(此处命名)无论如何都会被重新创建,因为它只是在计算属性中调用,但它的body 不会被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-09-10
    相关资源
    最近更新 更多