SwiftUI调用ContentView报numberOfDoors参数缺失 如何传入用户选择的动态值
问题核心原因
- 你自定义了
ContentView的构造方法要求必须传入numberOfDoors整数参数,但在App入口调用ContentView()时没有传参,所以触发参数缺失报错 - 现有逻辑存在隐藏问题:用户通过Picker修改门的数量后,输入框数组
multiOptions不会同步更新长度,仅会在初始化时生成一次
修复方案
步骤1:给ContentView的构造方法添加默认参数
无需修改App入口代码即可解决编译报错,同时支持自定义初始门数量,修改ContentView的初始化代码如下:
// 原init代码 init(numberOfDoors: Int) { self.numberOfDoors = numberOfDoors self.multiOptions = [String](repeating: "", count: numberOfDoors) } // 修改后init代码 init(numberOfDoors: Int = 1) { self._numberOfDoors = State(initialValue: numberOfDoors) self._multiOptions = State(initialValue: [String](repeating: "", count: numberOfDoors)) }
使用State(initialValue:)的方式给@State属性赋值是更规范的初始化写法,可避免运行时异常。
步骤2:添加参数监听,门数量变化时同步更新输入框数组
在body的NavigationView后添加onChange修饰符,监听numberOfDoors的变化,动态调整multiOptions的长度,同时保留用户已经输入的内容:
NavigationView { // 原有代码保持不变 } .onChange(of: numberOfDoors) { newValue in var newOptions = [String](repeating: "", count: newValue) // 保留已有输入内容 for i in 0..<min(newValue, multiOptions.count) { newOptions[i] = multiOptions[i] } multiOptions = newOptions }
步骤3:修复Picker选择不生效的问题
现有代码的Picker没有给选项添加tag,会导致选择后值无法正确绑定到numberOfDoors,修改Picker的ForEach部分代码:
Picker("Number of doors", selection: $numberOfDoors) { ForEach(1 ..< 64) { num in Text("\(num) doors") .tag(num) } }
修复后完整的App入口代码(无需改动,保持原有即可)
import SwiftUI @main struct NumOfDoorsApp: App { var body: some Scene { WindowGroup { ContentView() } } }
内容的提问来源于stack exchange,提问作者Calvin Wood
相关产品推荐
相关产品推荐

