在swiftUI中过滤结果的数量

s4n0splo  于 2023-05-28  发布在  Swift
关注(0)|答案(2)|浏览(142)

我正忙碌着做一个应用程序,在swiftUI中生成随机电影结果。现在的默认值是3,但我希望能够改变,从1到10。因此,如果用户想要5个结果而不是3个,则应该将默认值覆盖为5。可惜我想不出来。有人能帮我吗?
This is the filterView

let optionRange = 1...10
    @State var numOptions: Int = 3

var body: some View {
        NavigationView {
            VStack {
                List {
                    VStack {
                        Picker("Nr. of options", selection: $numOptions) {
                            ForEach(optionRange, id: \.self) { option in
                                Text("\(option)")
                            }
                        }
                    }
}
                Button(action: {
                    let randomiserView = RandomiserView(numOptions: numOptions)
                    self.presentationMode.wrappedValue.dismiss()
                }, label: {
                    Text("Done")
                        .foregroundColor(.white)
                        .frame(width:300, height: 50)
                        .background(Color.accentColor)
                        .cornerRadius(10)
                })
            }
            .navigationTitle("Filter")
        }
    }
}

This is the randomiserView

@State var numOptions: Int = 3
@State var randomNumber = [Int]()

var body: some View {
        NavigationView {
            VStack {
                Spacer()
                    .frame(height: 10)
                Button("Filters") {
                    isShowingFilters.toggle()
                }
                .font(.headline)
                .foregroundColor(.white)
                .frame(width:300, height: 50)
                .background(Color.accentColor)
                .cornerRadius(10)
                .sheet(isPresented: $isShowingFilters) {
                    FilterView(numOptions: numOptions)
                }

                Spacer()
                
                ScrollView(.horizontal, showsIndicators: false) {
                    HStack(alignment: .top, spacing: 30) {
                        Spacer()
                        ForEach(filteredMovies, id: \.self) { movie in
                            NavigationLink(destination: MovieDetailView(movieId: movie.id)) {
                                VStack(alignment: .leading) {
                                    HStack{
//                                        Text("\(numOptions / numOptions)")
                                        Text(movie.title)
                                            .font(
                                                .system(size: 25)
                                                .weight(.bold)
                                            )
                                            .foregroundColor(CustomColor.textColor)
                                    }
                                    MoviePosterCard(movie: movie)
                                        .frame(width: 260, height: 390)
                                    Text(movie.genreText)
                                        .foregroundColor(CustomColor.textColor)
                                    HStack {
                                        Image("Heart")
                                            .resizable()
                                            .frame(width: 25, height: 25)
                                            .padding(.trailing, -5)
                                        Text(movie.ratingText).foregroundColor(.accentColor)
                                    }
                                    .padding(.top, -10)
                                    .padding(.bottom, -10)
                                }
                                .frame(width: 260)
                                .padding(20)
                                .background(Color.gray.opacity(0.2))
                                .cornerRadius(10)
                            }
                        }
                        Spacer()
                    }
                }

                Spacer()

                Button(action: {
                    var randomNumbers = [Int]()
                    while randomNumbers.count < numOptions {
                        let randomNumber = Int.random(in: 1...1000)
                        randomNumbers.append(randomNumber)
                        print(randomNumber)
                    }

                    var fetchedRandomMovies = [Movie]()

                    for randomNumbers in randomNumber {
                        MovieStore.shared.fetchMovies(from: .popular) { result in
                            switch result {
                            case .success(let movies):
                                fetchedRandomMovies.append(movie)
                            case .failure(let error):
                                print(error.localizedDescription)
                            }
                        }
                    }

                    var fetchedMovies = [Movie]()
                    let dispatchGroup = DispatchGroup()

                    for id in randomNumbers {
                        dispatchGroup.enter()
                        MovieStore.shared.fetchMovie(id: id) { result in
                            switch result {
                            case .success(let movie):
                                fetchedMovies.append(movie)
                            case .failure(let error):
                                print(error.localizedDescription)
                            }
                            dispatchGroup.leave()
                        }
                    }

                    dispatchGroup.notify(queue: .main) {
                        self.filteredMovies = fetchedMovies
                        self.movieTitles = fetchedMovies.map({ $0.title })
                        print(self.movieTitles)
                    }
                    
                }) {
                    Text("Randomise")
                        .font(.headline)
                        .foregroundColor(.white)
                        .frame(width:300, height: 50)
                        .background(Color.accentColor)
                        .cornerRadius(10)
                }

现在,“完成”按钮在过滤器视图绝对没有做任何事情。当我选择一些过滤器并按下完成时,过滤器不会被保留。

rbl8hiat

rbl8hiat1#

在筛选器视图中,需要将numOptions更改为Binding,因为您希望对属性的更改影响RandomiserView中的相应属性

@Binding var numOptions: Int

然后在Button操作中,您应该只关闭视图

Button(action: {
    self.presentationMode.wrappedValue.dismiss()
}, label: { 
    // ...
}
sqserrrh

sqserrrh2#

看起来您没有将filterView中的numOptions变量注入到randomiserView中; radomiserView正在使用自己的变量named(numOptions)。尝试使用初始化器将此变量从过滤器注入到随机化器,或者在randomiserView内部使用numOptions的绑定。

相关问题