You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何向结构体组件传递参数?

SwiftUI自定义按钮绑定父视图状态的解决方法

你的问题核心是没搞清楚SwiftUI中状态传递的正确方式,下面直接给你修正方案:

问题分析

  • 父视图的currentCalcToChange是@State变量,要让子组件能修改它,子组件必须用@Binding来接收,而不是@State
  • 按钮自身的点击变色状态didTap属于组件内部状态,用@State是对的

修正后的完整代码

struct ContentView: View {
    // 父视图的状态变量
    @State var currentCalcToChange: Int = 0
    
    var body: some View {
        // 传递绑定值,用$前缀获取State的绑定
        CustomButton(currentCalc: $currentCalcToChange)
    }
}

struct CustomButton: View {
    // 按钮自身的点击状态,内部管理用@State
    @State private var didTap: Bool = false
    // 接收父视图的绑定,用@Binding
    @Binding var currentCalc: Int
    
    var body: some View {
        Button(String(currentCalc)) {
            // 修改绑定变量,父视图的currentCalcToChange会同步更新
            currentCalc += 100
            // 切换按钮自身的点击状态
            didTap.toggle() // 用toggle()比直接赋值true更合理,点击一次切换一次
        }
        .background(didTap ? Color.blue : Color.yellow)
    }
}

关键改动说明

  1. 子组件接收方式:把@State var currentCalc: Int改成@Binding var currentCalc: Int,这样子组件就能和父视图的状态双向绑定
  2. 父视图传递方式:调用CustomButton时用$currentCalcToChange,$符号是获取@State变量的绑定实例
  3. 点击状态优化:用didTap.toggle()替代直接赋值true,这样每次点击都会切换颜色,更符合"点击切换颜色"的需求

内容的提问来源于stack exchange,提问作者dinolin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:16:59