Binding 将@State变量传递给ContentView

Binding 将@State变量传递给ContentView,binding,swiftui,state,Binding,Swiftui,State,构建我的第一个SwiftUI应用程序时,我被困在将@State var传递到ContentView上。我在一个结构中声明了@State变量,在ContentView中的变量上有一个@Binding标记 我的目的是在ContentView中调用NumberBlock的多个实例,并能够用一个按钮将所有实例重置为false(隐藏所有图像) Xcode 12中添加的新“App”结构因缺少参数而出错。我尝试了所有我能想到的方法来输入一个参数,但似乎什么都不起作用。我可以通过使用.constant(true

构建我的第一个SwiftUI应用程序时,我被困在将@State var传递到ContentView上。我在一个结构中声明了@State变量,在ContentView中的变量上有一个@Binding标记

我的目的是在ContentView中调用NumberBlock的多个实例,并能够用一个按钮将所有实例重置为false(隐藏所有图像)

Xcode 12中添加的新“App”结构因缺少参数而出错。我尝试了所有我能想到的方法来输入一个参数,但似乎什么都不起作用。我可以通过使用.constant(true)来消除错误,但这并没有提供我需要的功能,即从ContentView切换变量

我感谢任何帮助消除错误或纠正我对@State和@Binding的肤浅理解

这里是我创建@State reset_x变量的地方

import SwiftUI

struct NumberBlock: View {
    
    @State var reset_x: Bool = true
    
    @Binding var reset: Bool
    
    var body: some View {
        ZStack {
            
            Text("test")
                .onTapGesture(count: 1, perform: {
                    self.reset_x = false
                })
            Image("XMark")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 50, height: 50, alignment: .center)
                .onTapGesture(count: 1, perform: {
                    self.reset_x = true
                    print("reset_x is \(self.reset_x)")
                })
                
                .isHidden(reset_x ? true : false)
                .isHidden(reset ? true : false)
        
        }
    }
}
此视图中出现错误:

import SwiftUI

@main
struct Quixx2App: App {
        
    var body: some Scene {
        
        WindowGroup {
            ContentView()
        }
    }
}
这里是我想使用@Binding的地方

import SwiftUI

struct ContentView: View {
    
    @State var reset: Bool = false
    @Binding var reset_x: Bool
    
    var body: some View {
        VStack {
            HStack {
                NumberBlock(reset: self.$reset)
                NumberBlock(reset: self.$reset)
            }
            Button("Reset Score"){
                self.scoreKeeper.redScore = 0
                self.reset_x = false //this line is not doing anything
                print("reset_x is \(self.reset_x)")
            }

        }
    }
}
和.ishiden扩展名

import Foundation
import SwiftUI

extension View {   
    @ViewBuilder func isHidden(_ hidden: Bool, remove: Bool = false) -> some View {
        if hidden {
            if !remove {
                self.hidden()
            }
        } else {
            self
        }
    }
}

让我们从您的
NumberBlock
视图开始。视图中需要一个状态,该状态在图像是否隐藏时保留。通过点击文本视图,将切换该值,并相应地呈现视图

struct NumberBlock:视图{
@国家私有var imageIsHidden:Bool
var body:一些观点{
VStack{
文本(“显示”)
.ONTAPPORATE(计数:1,执行:{
self.imageshidden=false
})
文本(“图像”)
.ONTAPPORATE(计数:1,执行:{
self.imageshidden=true
})
.isHidden(imageIsHidden?真:假)
}
}
}
现在,您需要第二个功能:
ContentView
应该控制此状态。因此,您必须将此状态从子视图(
NumberBlock
)提取到父视图(
ContentView
)。通过将属性从
@State
更改为
@Binding
,您基本上是在告诉子视图该数据是从父视图传递的

我的工作示例:

导入快捷界面
进口基金会
扩展视图{
@ViewBuilder func isHidden(uHidden:Bool,remove:Bool=false)->某些视图{
如果隐藏{
如果!移除{
self.hidden()
}
}否则{
自己
}
}
}
结构号块:视图{
@绑定变量imageshidden:Bool
var body:一些观点{
VStack{
文本(“显示”)
.ONTAPPORATE(计数:1,执行:{
self.imageshidden=false
})
文本(“图像”)
.ONTAPPORATE(计数:1,执行:{
self.imageshidden=true
})
.isHidden(imageIsHidden?真:假)
}
}
}
结构ContentView:View{
@状态变量imageOfBlock1IsHidden:Bool=true
@状态变量imageOfBlock2IsHidden:Bool=true
var body:一些观点{
VStack{
HStack{
NumberBlock(imageIsHidden:self.$imageOfBlock1IsHidden)
NumberBlock(imageIsHidden:self.$imageOfBlock2IsHidden)
}
按钮(“重置分数”){
self.imageOfBlock1isheden=true
self.imageOfBlock2IsHidden=true
}
}
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}

我说对了吗?如果单击文本视图,则应显示其自己的NumberBlock中的图像。如果单击该图像,它应该再次隐藏。如果你点击“重置分数”,所有数字块中的所有图像都应该隐藏。是的,完全正确。谢谢,这很有帮助。所以在本例中,我将为每个图像创建一个@State变量?我认为这会起作用,但总共会有50张图片,这意味着要管理一长串变量。是的,正确。如果你的逻辑变得复杂,考虑引入VIEW模型是否合理。但这就像是在没有额外信息的情况下在黑暗中捅了一刀。