SwiftUI - @State属性未更新

4

自从升级到Xcode 12 / iOS 14以来,我遇到了一些奇怪的行为。为了验证这个行为,我将其隔离在一个测试应用程序中。

在我的原始应用程序中,我有多个Sheet需要控制。这就是为什么我有一个enum来区分当前活动的Sheet,并将其存储在@State private var activeSheet中。在@ViewBuilder函数sheetContent()中,我返回所选SheetView

出于简单起见,对于这个测试应用程序,我只实现了一个单独的Sheet

这是ContentView的代码:

struct ContentView: View {
    @State private var showingSheet = false
    @State private var activeSheet = ContentViewSheets.State.none
    var body: some View {
        Button(action: {
            activeSheet = .aSheet
            showingSheet = true     // <-- ISSUE: activeSheet is still set to .none here!
        }) {
            Text("Open Sheet")
        }
        .sheet(isPresented: $showingSheet, content: sheetContent)
    }
    
    @ViewBuilder
    private func sheetContent() -> some View {
        switch activeSheet {
        case .aSheet:
            Text("I'm the right sheet!")
        case .none:
            Text("Oops! I'm not supposed to show up!")
        }
    }
}

这是枚举的代码:

class ContentViewSheets {
    enum State {
        case aSheet
        case none
    }
}

如上所述,ContentView代码中的activeSheet属性值从未更改为.aSheet,而是保持为.none - 因此会显示错误的表格。

这是一个错误还是我没有正确理解苹果的@State?他们在文档中只写到不应在初始化器中使用它,而仅应在body内使用,我确实这样做了。


完全有同样的问题! - chopsalot
1个回答

5

不要使用两种状态,而是使用一种状态,并为这种情况显式地设计样式修饰符。

已与Xcode 12 / iOS 14进行了测试。

class ContentViewSheets {
    enum State: Identifiable {
        case aSheet
        case none

        var id: State { self }
    }
}

struct ContentView: View {
    @State private var activeSheet: ContentViewSheets.State?
    var body: some View {
        Button(action: {
            activeSheet = .aSheet
        }) {
            Text("Open Sheet")
        }
        .sheet(item: $activeSheet) { 
           sheetContent($0) // << activate state passed here !!!
        }
    }

    @ViewBuilder
    private func sheetContent(_ state: ContentViewSheets.State) -> some View {
            switch state {
            case .aSheet:
                Text("I'm the right sheet!")
            default:
                Text("Oops! I'm not supposed to show up!")
            }
    }
}

1
非常好,谢谢你,Asperi!非常优雅的解决方案!我仍然在努力理解为什么我的代码不起作用。似乎我不理解@State属性的本质。 - Ulrich
@Asperi,你是个大神。我在这个问题上已经挣扎了4个小时……至于Ulrich,我不知道为什么它不起作用。我想这肯定是一个bug。 - Xaxxus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接