SwiftUI 工作表在首次出现时不会访问状态变量的最新值

Posted

技术标签:

【中文标题】SwiftUI 工作表在首次出现时不会访问状态变量的最新值【英文标题】:SwiftUI sheet doesn't access the latest value of state variables on first appearance 【发布时间】:2020-10-27 09:33:29 【问题描述】:

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

例如使用此代码:

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()
    

这将在第一次点击时显示“否”,在第二次点击时显示“是”,如下所示:

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

【问题讨论】:

【参考方案1】:

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

使用 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 工作表在首次出现时不会访问状态变量的最新值的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 工作表在第一次呈现时被关闭

watchOS 中的扩展运行时会话在首次运行后停止工作

为啥谷歌地图在首次启动时不会自动缩放到用户位置?

如何防止工作表在 SwiftUI 中使其后面的视图变暗或删除不必要的填充?

为什么在首次启动时我的导航栏位于状态栏下

根据地理位置在首次访问时重定向用户