首页 > 解决方案 > 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())
            }
            
        }

标签: swiftxcodebuttonswiftui

解决方案


问题是您没有更新“film.isPreferred”的状态。

我猜您正在使用视图模型,并且在此视图模型中,您必须将对象或对象数组设置为 @Published 变量。

例如 :

@Published var foo : Foo

在此之后,您将能够更改该值。


推荐阅读