SwiftUI 表在第一次出现时不会访问状态变量的最新值 [英] SwiftUI sheet doesn't access the latest value of state variables on first appearance

查看:37
本文介绍了SwiftUI 表在第一次出现时不会访问状态变量的最新值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

第一次显示工作表时,状态变量似乎没有正确更新.

It seems like the state variable are not properly updated when a sheet is displayed for the first time.

例如使用此代码:

import SwiftUI

struct DemoView: View {
    @State var showDetails: Bool = false
    var body: some View {
        VStack {
            Button(action: {
              showDetails = true
            }) {
                Text("Show sheet")
            }
        }.sheet(isPresented: $showDetails){
            VStack {
                Text("showDetails: \(showDetails ? "yes" : "no")")
            }
        }
    }
}

struct DemoView_Previews: PreviewProvider {
    static var previews: some View {
        DemoView()
    }
}

这将显示否";第一次点击,然后是"其次,如下所示:

This will display "no" on first click, and "yes" on second, as showcased here:

我错过了什么吗?如何确保工作表视图正确读取我的状态变量?

Am I missing something? How can I make sure my state variables are properly read by the sheet view?

推荐答案

您会看到工作表创建时间的价值.如果要跟踪父视图状态,请创建绑定到该状态的工作表子视图,如下所示.当子视图出现时绑定将更新子视图.

You see value on time of sheet creation. If you want to track parent view state create sheet subview with binding to that state, like below. Binding will update subview when subview will appear.

使用 Xcode 12/iOS 14 测试

Tested with Xcode 12 / iOS 14

struct DemoView: View {
    @State var showDetails: Bool = false
    var body: some View {
        VStack {
            Button(action: {
              showDetails = true
            }) {
                Text("Show sheet")
            }
        }.sheet(isPresented: $showDetails){
            SheetDetailView(flag: $showDetails)
        }
    }
}

struct SheetDetailView: View {
    @Binding var flag: Bool
    var body: some View {
        VStack {
            Text("showDetails: \(flag ? "yes" : "no")")
        }
    }
}

这篇关于SwiftUI 表在第一次出现时不会访问状态变量的最新值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆