簡體   English   中英

如何修改 SwiftUI 中的列表數據

[英]How to modify List Data in SwiftUI

當用戶點擊該項目時,我想更改與列表中的項目關聯的 object 的值,並且我收到下一個錯誤“無法分配給屬性:'學生'是'讓'常量”。 我該如何防止這種情況發生?

這是我的代碼:

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()
    }
}

正如評論中提到的@koen,您應該在 SwiftUI 視圖中使用@State@EnvironmentObject訪問/變異變量和 state。

與 UIKit 不同,您可能會注意到 SwiftUI 如何依賴於結構的大量使用。 默認情況下,結構是不可變的,這意味着您不能在沒有明確告訴編譯器結構是可變的(使用var關鍵字等)的情況下修改結構的任何部分。在 SwiftUI 中管理 state 的方法是使用Combine框架以及@State屬性的使用等。簡要查看您的代碼,看起來您需要做的就是將@State var student: Student添加到您的StudentItemListView

如果這聽起來令人困惑,或者您不知道@State可能是什么,我強烈建議您觀看2019 WWDC 視頻並查看 Apple 提供的SwiftUI 教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM