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

Posted

技术标签:

【中文标题】首次启动后 SwiftUI 工作表从未更新【英文标题】:SwiftUI sheet never updated after first launch 【发布时间】:2019-08-30 09:50:52 【问题描述】:

我使用一个模式表,其内容会针对每次调用进行更新。但是,当内容被标记为@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】:

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

要创建ContentView @State 值的连接或绑定,您应该将SheetView var 定义为@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)
        )
    

【讨论】:

以上是关于首次启动后 SwiftUI 工作表从未更新的主要内容,如果未能解决你的问题,请参考以下文章

SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象

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

从 SwiftUI 中的工作表更新列表视图中的行

SwiftUI:以编程方式关闭工作表

SwiftUI:工作表第一次无法显示正确的值

SwiftUI 模式表在关闭后重新打开