微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

@State var 不存储值

如何解决@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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?