首页 > 解决方案 > SwiftUI @State 和 .sheet() ios13 与 ios14

问题描述

您好,我在这里遇到了问题,在 ios13 或 ios14 上运行时,我的 .sheet() 视图之间的行为不一致

我有这样的看法:

@State private var label: String = "" 
@State private var sheetDisplayed = false
///Some code
var body: some View {
   VStack {
      Button(action: {
         self.label = "A label"
         self.isDisplayed = true
      }) {
           Text("test")
       }
   }.sheet(isPresented: $sheetDisplayed, onDismiss: {
        self.label = ""
    }) {
        Text(self.label)
       }
 }

在 ios 13 上,这项工作按预期工作 btn 单击 -> 设置标签 -> 调用表 -> 在文本视图中显示“A 标签”。

在 ios14 上,当我关闭工作表时,self.label 中有一个空字符串,因此它不显示任何内容。

我错过了什么吗?是 iOS 14 的错误还是我在 ios13 上弄错了,并得到了纠正。

PS:我在闭包中传递了几个其他变量,我对其进行了简化。

标签: swiftuiios13ios14

解决方案


您的代码期望视图更新/创建顺序,但通常它是未定义的(并且可能在 iOS 14 中更改)。

有明确的方式在工作表内传递信息 - 使用不同的工作表创建者,即。.sheet(item:...

这是工作可靠的例子。使用 Xcode 12 / iOS 14 测试

struct ContentView: View {
    @State private var item: Item?

    struct Item: Identifiable {
        let id = UUID()
        var label: String = ""
    }

    var body: some View {
        VStack {
            Button(action: {
                self.item = Item(label: "A label")
            }) {
                Text("test")
            }
        }.sheet(item: $item, onDismiss: {
            self.item = nil
        }) {
            Text($0.label)
        }
    }
}

推荐阅读