如何在SwiftUI

时间:2019-11-20 16:33:49

标签: swift swiftui swift5.1 swiftui-list

当用户点击列表中的某个项目时,我想更改与该项目相关联的对象的值,然后收到下一个错误“无法分配给属性:'student'是'let'常量”。我如何防止这种情况发生?

这是我的代码:

import SwiftUI

var students: [Student] = load("studentsData.json")

struct StudentsListView: View {
    @EnvironmentObject var viewRouter:ViewRouter

    var body: some View {
        NavigationView{
            List(students){student in
                Button(action: {
                    student.isInClass = true
                }){
                    StudentItemListView(student: student)
                }
            }
        }
    }
}

struct StudentsListView_Previews: PreviewProvider {
    static var previews: some View {
        StudentsListView().environmentObject(ViewRouter())
    }
}

struct StudentItemListView: View {
    var student:Student

    var body: some View {
        HStack {
            Image("profile")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width:50, height:50)
                .clipShape(Circle())
            VStack(alignment: .leading){
                Text(student.firstName + " " + student.lastName)
                    .font(.headline)
                if(student.isInClass == true){
                    Text("Asistió")
                    .font(.subheadline)
                    .foregroundColor(.green)
                } else {
                    Text("Faltó")
                    .font(.subheadline)
                    .foregroundColor(.red)
                }
            }
            Spacer()
        }.padding()
    }
}

1 个答案:

答案 0 :(得分:1)

如评论中的@koen所述,您应该使用@State@EnvironmentObject来访问/更改SwiftUI视图中的变量和状态。

与UIKit不同,您可能会注意到SwiftUI如何依赖大量使用结构。默认情况下,结构是不可变的,这意味着您不能在不明确告诉编译器该结构可变的情况下修改该结构的任何部分(使用var关键字等)。在SwiftUI中管理状态的方法是使用Combine框架的使用以及@State属性的使用等。从代码的简要介绍看,您需要做的就是将@State var student: Student添加到{{1} }。

如果这听起来有点令人困惑,或者您不知道StudentItemListView可能是什么,我强烈建议您观看2019 WWDC videos并查看Apple提供的SwiftUI tutorial