SwiftUI随机电影应用结果数量筛选功能失效求助
解决SwiftUI筛选视图设置无法同步的问题
问题根源
当前代码的核心问题是状态传递逻辑错误:
- FilterView使用
@State存储numOptions,无法与父视图RandomiserView共享状态变更 - Done按钮中新建
RandomiserView实例的操作完全无效,不会更新原视图的状态 - RandomiserView向FilterView传递的是值类型,而非双向绑定通道
修复步骤
1. 将FilterView改为双向绑定模式
把FilterView里的@State替换为@Binding,让它能直接读写父视图的状态:
let optionRange = 1...10 @Binding var numOptions: Int // 改为Binding类型,移除默认值 var body: some View { NavigationView { VStack { List { VStack { Picker("Nr. of options", selection: $numOptions) { ForEach(optionRange, id: \.self) { option in Text("\(option)") } } } } Button(action: { self.presentationMode.wrappedValue.dismiss() // 仅关闭视图,无需新建实例 }, label: { Text("Done") .foregroundColor(.white) .frame(width:300, height: 50) .background(Color.accentColor) .cornerRadius(10) }) } .navigationTitle("Filter") } }
2. 调整RandomiserView的Sheet绑定逻辑
RandomiserView保留@State作为状态源,在弹出FilterView时传递状态的绑定引用:
@State var numOptions: Int = 3 @State private var isShowingFilters = false // 补充缺失的弹窗控制变量 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) // 传递绑定而非单纯的值 } // 其余视图代码保持不变... } } }
额外代码修正提示
RandomiserView的Randomise按钮代码存在两处明显错误:
- 循环变量名重复:
for randomNumbers in randomNumber应改为for number in randomNumbers - 闭包引用未定义变量:
fetchedRandomMovies.append(movie)需修正为正确的电影对象(这段代码看起来冗余,可考虑移除,因为后续已通过fetchMovie获取单部电影)
内容的提问来源于stack exchange,提问作者Joost van Grieken
相关产品推荐
相关产品推荐

