swift - SwiftUI 按钮动态 SF 符号
问题描述
我想让用户可以在电影列表中将某些电影标记为首选。我写了这段代码,但是当我点击图标时,符号没有更新。
这样做的正确方法是什么?
主类 FIlmJSON 设置为 ObservableObject 并且 allFilms 设置为已发布
电影.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
}
目录.swift
@Published var allFilms: [FilmJSON] = []
内容视图.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())
}
}
解决方案
问题是您没有更新“film.isPreferred”的状态。
我猜您正在使用视图模型,并且在此视图模型中,您必须将对象或对象数组设置为 @Published 变量。
例如 :
@Published var foo : Foo
在此之后,您将能够更改该值。