我正忙碌着做一个应用程序,在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)
}
现在,“完成”按钮在过滤器视图绝对没有做任何事情。当我选择一些过滤器并按下完成时,过滤器不会被保留。
2条答案
按热度按时间rbl8hiat1#
在筛选器视图中,需要将
numOptions
更改为Binding
,因为您希望对属性的更改影响RandomiserView
中的相应属性然后在
Button
操作中,您应该只关闭视图sqserrrh2#
看起来您没有将
filterView
中的numOptions
变量注入到randomiserView
中;radomiserView
正在使用自己的变量named(numOptions)
。尝试使用初始化器将此变量从过滤器注入到随机化器,或者在randomiserView
内部使用numOptions
的绑定。