gpt4 book ai didi

SwiftUI - @State 属性未更新

转载 作者:行者123 更新时间:2023-12-04 01:13:17 47 4
gpt4 key购买 nike

自从更新到 Xcode 12/iOS 14 后,我遇到了一些奇怪的行为。为了验证这种行为,我将它隔离在一个测试应用程序中。
在我原来的应用程序中,我有多个 Sheet s 来控制。这就是为什么我有 en enum区分当前事件的工作表,我将其存储在 @State private var activeSheet 中.在 @ViewBuilder功能 sheetContent()我退回了View对于选定的 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 - 这样就会出现错误的表。
这是错误还是我没有正确理解 Apple 的 @State ?他们只是在文档中写到它不应该在初始化程序中使用,而只能在 body 中使用。 ,我肯定会这样做。

最佳答案

对于这种情况,不要使用两种状态,而是使用一种明确设计的图纸修改器。
使用 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!")
}
}
}

关于SwiftUI - @State 属性未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64139912/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com