Binding 将@State变量传递给ContentView
构建我的第一个SwiftUI应用程序时,我被困在将@State var传递到ContentView上。我在一个结构中声明了@State变量,在ContentView中的变量上有一个@Binding标记 我的目的是在ContentView中调用NumberBlock的多个实例,并能够用一个按钮将所有实例重置为false(隐藏所有图像) Xcode 12中添加的新“App”结构因缺少参数而出错。我尝试了所有我能想到的方法来输入一个参数,但似乎什么都不起作用。我可以通过使用.constant(true)来消除错误,但这并没有提供我需要的功能,即从ContentView切换变量 我感谢任何帮助消除错误或纠正我对@State和@Binding的肤浅理解 这里是我创建@State reset_x变量的地方Binding 将@State变量传递给ContentView,binding,swiftui,state,Binding,Swiftui,State,构建我的第一个SwiftUI应用程序时,我被困在将@State var传递到ContentView上。我在一个结构中声明了@State变量,在ContentView中的变量上有一个@Binding标记 我的目的是在ContentView中调用NumberBlock的多个实例,并能够用一个按钮将所有实例重置为false(隐藏所有图像) Xcode 12中添加的新“App”结构因缺少参数而出错。我尝试了所有我能想到的方法来输入一个参数,但似乎什么都不起作用。我可以通过使用.constant(true
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模型是否合理。但这就像是在没有额外信息的情况下在黑暗中捅了一刀。