【发布时间】:2021-09-25 08:48:02
【问题描述】:
我想让用户可以在电影列表中将某些电影标记为首选。我写了这段代码,但是当我点击图标时,符号没有更新。
这样做的正确方法是什么?
主类FIlmJSON设置为ObservableObject,allFilms设置为已发布
Film.swift
class Film: Codable, Identifiable, ObservableObject {
var id: UUID {
return UUID()
}
var filmname: String?
var developer: String?
var dilution: String?
var iso: String?
var mm35: String?
var mm120: String?
var temperature: String?
var brand: String?
var type: String?
var note: String?
}
// Avoid dealing with optional
extension Film {
var _filmname: String {
return filmname ?? ""
}
var _developer: String {
return developer ?? ""
}
var _dilution: String {
return dilution ?? ""
}
var _iso: String {
return iso ?? ""
}
var _mm35: String {
return mm35 ?? ""
}
var _mm120: String {
return mm120 ?? ""
}
var _temperature: String {
return temperature ?? ""
}
var _brand: String {
return brand ?? ""
}
var _type: String {
return type ?? ""
}
var _note: String {
return note ?? ""
}
}
FilmJSON.swift
class FilmJSON: Codable, ObservableObject, Identifiable {
var filmName: String
var films: [Film]
var isPreferred: Bool
init(filmName: String, films: [Film], isPreferred: Bool) {
self.filmName = filmName
self.films = films
self.isPreferred = isPreferred
}
Catalogue.swift
@Published var allFilms: [FilmJSON] = []
ContentView.swift
NavigationView {
VStack {
List {
ForEach(catalogue.allFilms) { film in
HStack {
Button {
film.isPreferred.toggle()
} label: {
Image(systemName: film.isPreferred ? "star.fill" : "star")
}
.buttonStyle(PlainButtonStyle())
NavigationLink(destination: DeveloperView(film: film)) {
Text("\(film.filmName)")
}
Spacer()
}
}
}
.listStyle(GroupedListStyle())
}
}
【问题讨论】:
-
isPreferred或 film 对象必须是出版商。 -
allFilms 是出版商。在 mu 代码中,我有 ``` @Published var allFilms: [FilmJSON] = [] ```
-
ObservableObjects 数组将无法按预期工作。我会重构,以便您拥有 one ObservableObject 来存储
structs 的数组。如果您包含足够的 minimal reproducible example,有人可以向您展示如何执行此操作。 -
我添加了一些细节,但代码非常简单。另外,如果我更改选项卡并返回按钮更改时的图像,就像按钮没有刷新 UI
-
代码不是简单的——如果你需要有人教你如何修复,你想让他们的工作尽可能简单——他们可以复制/粘贴并修复给你看。现在,有太多的事情要摆脱。但是,同样,ObservableObjects 策略数组将无法按预期工作,因为 View 不知道在数组中查找更改。
标签: swift xcode button swiftui