ios - SwiftUI @Binding 属性不更新嵌套视图 - Xcode 12
问题描述
我在使用 @Binding 属性更新嵌套的 SwiftUI 视图时遇到问题。我用 ObservableObject 协议声明了一个 DataModel:
class DataModel: ObservableObject {
@Published var subjects: [Subject] = []
...
}
我将它添加到我的主应用程序中:
@main
struct LessonToTextApp: App {
@ObservedObject private var data = DataModel()
var body: some Scene {
WindowGroup {
NavigationView {
SubjectsView(subjects: $data.subjects) {
data.save()
}
}
.onAppear {
data.load()
}
}
}
}
我将 Subjects 数组传递给第一个视图
struct SubjectsView: View {
@Binding var subjects: [Subject]
var body: some View {
List {
if subjects.isEmpty {
Text("subjects.empty")
} else {
ForEach(subjects) { subject in
NavigationLink(destination: DetailView(subject: binding(for: subject), saveAction: saveAction)) {
CardView(subject: subject)
}
.listRowBackground(subject.color)
.cornerRadius(10)
}
}
}
private func binding(for subject: Subject) -> Binding<Subject> {
guard let subIndex = subjects.firstIndex(where: { $0.id == subject.id }) else {
fatalError("Can't find subject in array")
}
return $subjects[subIndex]
}
然后我使用上面声明的函数绑定将单个主题传递给第二个视图:
struct DetailView: View {
@Binding var subject: Subject
var body: some View {
ForEach(subject.lessons) { lesson in
NavigationLink(destination: LessonView(lesson: lesson)) {
Text(lesson.date, style: .date)
}
}
.onDelete { indexSet in
self.subject.lessons.remove(atOffsets: indexSet)
}
}
在 DetailView 中,当我在 ForEach 中删除一个项目时,该项目仍然出现,视图不会更新。
我在 Xcode 12.3 (12C33) 上使用 SwiftUI 2.0
编辑这是模型:
struct Subject: Identifiable, Codable {
let id: UUID
var name: String
var teacher: String
var color: Color
var lessons: [Lesson]
}
struct Lesson: Identifiable, Codable {
let id: UUID
let date: Date
var lenghtInMinutes: Int
var transcript: String
}
解决方案
你SubjectsView
应该把整个DataModel
作为@EnvironmentObject
struct LessonToTextApp: App {
@StateObject private var data = DataModel()
var body: some Scene {
WindowGroup {
NavigationView {
SubjectsView().environmentObject(data) {
data.save()
}
...
struct SubjectsView: View {
@EnvironmentObject var data = DataModel
var body: some View {
List {
if data.subjects.isEmpty {
Text("subjects.empty")
...
而且,struct
是不可变的
class Subject: Identifiable, Codable, ObservableObject {
let id: UUID
@Published var name: String
@Published var teacher: String
@Published var color: Color
...
}
struct DetailView: View {
@ObservedObject var subject: Subject
var body: some View {
...
这样你就可以DetailView
使用
DetailView(subject: subject)
推荐阅读
- java - Java Varargs:在数组中查找数字的索引
- php - 将 curl php 响应转换为 xml
- python - 使用 dnspython 传输区域文件的问题
- mongodb - 如何在 PDI 中为 mongodb 输入步骤定义投影
- vba - 从进程名称中获取应用程序名称。64位需要
- laravel - 如何缩短 eloquent 查询
- sql - SQL 语法查询 order by
- nginx - Cpanel Nginx 仍在监听 80 端口
- c# - 将 SQl 转换为 LINQ(使用 case 语句方法)
- javascript - Jquery,如何使用 jquery 添加隐藏元素