SwiftUI Добавить в избранное - PullRequest
       135

SwiftUI Добавить в избранное

0 голосов
/ 07 августа 2020

Я пытаюсь создать список избранного, который позволяет пользователю добавлять шоу в свою библиотеку, когда они ищут его, но все, что я пробовал, не сработало. Может ли кто-нибудь помочь мне создать функцию, которая делает это?

Вот код:

import SwiftUI
import Combine

class APIStore: ObservableObject {
    
    @Published var serieses: [Series] = []
    @Published var seasons: [Season] = []
    @Published var episodes: [Episode] = []
    @Published var casts: [CastCrew] = []
    @Published var crews: [CastCrew] = []

    init() {
        serieses = []
        seasons = []
        episodes = []
        casts = []
        crews = []
    }
    
    func fetchSeries(pageNumber: Int = 1)  {
        
        let params = [
            ("page", String(pageNumber))
        ]
        ApiMapper().callAPI(withPath: AppData.show, params: params, andMappingModel: [Series].self) { [weak self] (result) in
            switch(result) {
            case .success(let serieses):
                DispatchQueue.main.async {
                    self?.serieses = serieses
                }
            case .failure(_):
                break
            }
        }
    }
    
    func searchSeries(searchString: String)  {
           
           let params = [
               ("q", searchString)
           ]
           ApiMapper().callAPI(withPath: AppData.search, params: params, andMappingModel: [SearchResult].self) { [weak self] (result) in
               switch(result) {
               case .success(let searchResult):
                   DispatchQueue.main.async {
                    self?.serieses = searchResult.compactMap({$0.series})
                   }
               case .failure(_):
                   break
               }
           }
       }
  }

И вот где я хочу добавить избранную кнопку, которую я не смог сделать


import SwiftUI
import SDWebImageSwiftUI

struct HomeView: View {
    
    @ObservedObject var apiStore  = APIStore()
    @ObservedObject var userShows = UserShowList()
    @State private var searchString = ""
    @State private var pageNumber = 1
    @State var selectedSeason: Int
    
    
    init(selectedSeason: Int) {
        UITableView.appearance().separatorStyle = .none
        _selectedSeason = State(initialValue: selectedSeason)
        //        self.series = series
    }
    
    var body: some View {
        NavigationView() {
            VStack(alignment: .leading, spacing: 5.0) {
                TextField("Search", text: $searchString, onEditingChanged: { status in
                    if !status && self.searchString != "" {
                        self.apiStore.searchSeries(searchString: self.searchString)
                        self.pageNumber = 1
                    }
                    //                    else if !status && self.searchString == "" {
                    //                        self.apiStore.fetchSeries(pageNumber: self.pageNumber)
                    //                    }
                })
                    .padding(.all, 10.0)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                List{
                    ForEach(self.apiStore.serieses) { series in
                        HStack {
                            SeriesCell(series : series, selectedSeason: self.$selectedSeason)
                                .onAppear {
                                    if series.id == self.apiStore.serieses.last?.id {
                                        self.pageNumber += 1
                                        self.apiStore.fetchSeries(pageNumber: self.pageNumber)
                                    }
                            }
                        }
                    }
                }
                .padding(.leading, -10.0)
                .frame(width: screen.width)
                .navigationBarTitle("Shows", displayMode: .inline)
                .onAppear {
                    self.apiStore.searchSeries(searchString: self.searchString)
                }
            }
            .environmentObject(userShows)
        }
    }
}


struct SeriesCell: View {
    
    var series: Series
    @Binding var selectedSeason: Int
    
    var seriesDate: String {
        let formatter = DateFormatter()
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "yyyy-MM-dd"
        if let date = formatter.date(from: series.premiered ?? "") {
            formatter.dateFormat = "yyyy"
            return formatter.string(from: date)
        } else {
            return series.premiered ?? ""
        }
    }
    
    var body: some View {
        NavigationLink(destination: DetailsView(series: series, selectedSeason: selectedSeason)) {
            VStack(alignment: .leading) {
                HStack(alignment: .center) {
                    ZStack {
                        WebImage(url: URL(string: (series.image?.original ?? "")))
                            .placeholder{Image(systemName: "tv.circle.fill").foregroundColor(Color.white)}
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 50, height: 73, alignment: .center)
                            .clipShape(RoundedRectangle(cornerRadius: 10, style: .circular))
                    }
                    
                    VStack(alignment: .leading, spacing: 5.0) {
                        Text(String(series.name ?? ""))
                            .font(.body)
                            .multilineTextAlignment(.leading)
                            .font(.title)
                        
                        Text(seriesDate)
                            .font(.subheadline)
                    }
                }
            }
            .frame(width: screen.width, alignment: .leading)
        }
    }
}

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете попробовать добавить экземпляр isFavourite: Bool в свой сезонный класс. Затем при создании представления «Избранное» вы можете перебирать все сезоны и отображать только те, для которых этот экземпляр является истинным

...