如何解决@State var 不存储值
我的目标是在视图之间传递值,从选择器到主题编辑器。当用户按下一个图标时,我会保存我想要传递的对象,然后使用 sheet
并传递带有 @State var
内容的新创建的视图。
对 @State var themetoEdit
的分配已成功完成,但是在 nil
中创建 ThemeEditor
视图时它是 sheet
我做错了什么?
struct Chooser: View {
@EnvironmentObject var store: Store
@State private var showThemeEditor = false
@State private var themetoEdit: ThemeContent?
@State private var editMode: EditMode = .inactive
@State private var isValid = false
var body: some View {
NavigationView {
List {
ForEach(self.store.games) { game in
NavigationLink(destination: gameView(game))
{
Image(systemName: "Wrench.fill")
.imageScale(.large)
.opacity(editMode.isEditing ? 1 : 0)
.onTapGesture {
self.showThemeEditor = true
/* themeInfo is of type struct ThemeContent: Codable,Hashable,Identifiable */
self.themetoEdit = game.themeInfo
}
vstack (alignment: .leading) {
Text(self.store.name(for: something))
HStack{
/* some stuff */
Text(" of: ")
Text("Interesting info")
}
}
}
}
.sheet(isPresented: $showThemeEditor) {
if self.themetoEdit != nil { /* << themetoEdit is nil here - always */
ThemeEditor(forTheme: self.themetoEdit!,$isValid)
}
}
}
.environment(\.editMode,$editMode)
}
}
}
struct ThemeEditor: View {
@State private var newTheme: ThemeContent
@Binding var isValid: Bool
@State private var themeName = ""
init(forTheme theme: ThemeContent,isValid: Binding<Bool>) {
self._newTheme = State(wrappedValue: theme)
self._validThemeEdited = isValid
}
var body: some View {
....
}
}
struct ThemeContent: Codable,Identifiable {
/* stores simple typed variables of information */
}
解决方法
.sheet
内容视图是在创建时捕获的,因此如果您想检查里面的内容,则需要使用 .sheet(item:)
变体,例如
.sheet(item: self.$themeToEdit) { item in
if item != nil {
ThemeEditor(forTheme: item!,$isValid)
}
}
注意:不清楚什么是 ThemeContent
,但可能需要使其符合附加协议。
使用Binding
。使用此更改您的 ThemeEditor 视图。
struct ThemeEditor: View {
@Binding private var newTheme: ThemeContent?
@Binding var isValid: Bool
@State private var themeName = ""
init(forTheme theme: Binding<ThemeContent?>,isValid: Binding<Bool>) {
self._newTheme = theme
self._isValid = isValid
}
var body: some View {
....
}
}
对于工作表代码
.sheet(isPresented: $showThemeEditor) {
ThemeEditor(forTheme: $themeToEdit,isValid: $isValid)
}
在行动
.onTapGesture {
/* themeInfo is of type struct ThemeContent: Codable,Hashable,Identifiable */
self.themeToEdit = game.themeInfo
self.showThemeEditor = true
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。