SwiftUI工作表在首次启动后从未更新

时间:2019-08-30 09:50:52

标签: swiftui

我使用一个模式表,其内容针对每个调用而更新。但是,当内容标记为@State时,视图主体将永远不会更新。

有人也看到吗?有解决方法吗?

这是调用视图:

struct ContentView: View {
    @State var isPresented = false
    @State var i = 0

    var body: some View {
        List {
            Button("0") {
                self.i = 0
                self.isPresented = true
            }
            Button("1") {
                self.i = 1
                self.isPresented = true
            }
        }
        .sheet(
            isPresented: $isPresented,
            content: {
                SheetViewNOK(i: self.i)
            }
        )
    }
}

这确实有效:

struct SheetViewOK: View {
    var i: Int

    var body: some View {
        Text("Hello \(i)") // String is always updated
    }
}

这不起作用。但是显然,在实际应用中,我需要使用@State,因为用户所做的更改需要反映在工作表的内容中:

struct SheetViewNOK: View {
    @State var i: Int

    var body: some View {
        Text("Hello \(i)") // String is never updated after creation
    }
}

1 个答案:

答案 0 :(得分:2)

在您的.sheet中,您将ContentView @State的值传递给新的@State。因此它将独立于ContentView

要创建ContentView @State值的连接或绑定,应将SheetView变量定义为@Binding。通过此编辑,您会将状态值的绑定传递到工作表视图。

struct SheetView: View {
    @Binding var i: Int

    var body: some View {
        Text("Hello \(i)")
    }
}

struct ContentView: View {
    @State var isPresented = false
    @State var i: Int = 0

    var body: some View {

        List {
            Button("0") {
                self.i = 0
                self.isPresented = true
            }
            Button("1") {
                self.i = 1
                self.isPresented = true
            }
        }.sheet(
            isPresented: $isPresented,
            content: {
                SheetView(i: self.$i)
        })
    }
}