VIPER アーキテクチャを使用して SwiftUI でプロジェクトを作成していますが、.onTapGesture を呼び出した後にイメージが更新されないという問題に直面しました。この機能に関連するコード ブロックは次のとおりです。
モデル:
class FavoriteBeers{
var favoriteBeers = [Beer]()
}
インタラクター:
func addToFavorites(beer: Beer){
favoriteBeers.favoriteBeers.append(beer)
saveFavoriteBeers()
}
func removeFromFavorites(_ beer: Beer) {
favoriteBeers.favoriteBeers.removeAll { $0 == beer }
saveFavoriteBeers()
}
func isFavorite(_ beer: Beer) -> Bool {
favoriteBeers.favoriteBeers.contains(beer)
}
プレゼンター:
func favoritesButton(_ beer: Beer) -> String{
if isFavorite(beer){
return SystemImages.FilledStar.rawValue
}else{
return SystemImages.EmptyStar.rawValue
}
}
private func isFavorite(_ beer: Beer) -> Bool{
return interactor.isFavorite(beer)
}
func addOrRemoveFromFavorites(_ beer: Beer){
if isFavorite(beer){
print("now not favourite")
interactor.removeFromFavorites(beer)
}else{
print("now favourite")
interactor.addToFavorites(beer: beer)
}
}
意見:
struct BeersListView: View{
@StateObject var presenter : BeersListPresenter
var body: some View {
NavigationView{
List{
ForEach(presenter.beers, id: \.id){ beer in
HStack{
VStack(alignment: .leading){
Text(beer.name)
.font(.headline)
Text("Vol: \(presenter.formattedABV(beer.abv))")
.font(.subheadline)
}
Spacer()
Image(systemName: presenter.favoritesButton(beer))
.frame(width: 13, height: 13)
.foregroundColor(.yellow)
.onTapGesture {
withAnimation{
presenter.addOrRemoveFromFavorites(beer)
}
}
}
}
}.onAppear{
presenter.loadList(at: 1)
} .listStyle(GroupedListStyle())
.navigationBarTitle("All beers")
}
}
}
そして結果は
しかし、スターボタンをタップすると、「今はお気に入り/今はお気に入りではありません」と表示されますが、画像は変わりません。前もって感謝します!