【问题标题】:SwiftUI Button Dynamic SF SymbolSwiftUI 按钮动态 SF 符号
【发布时间】: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


【解决方案1】:

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

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

例如:

@Published var foo : Foo

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

【讨论】:

  • allFilms 是出版商。在 mu 代码中,我有 ``` @Published var allFilms: [FilmJSON] = [] ```
  • 是FilmJSON 还是ObservableObject?
猜你喜欢
  • 2019-10-24
  • 2020-07-02
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多