【发布时间】:2021-02-26 07:14:18
【问题描述】:
构建我的第一个 SwiftUI 应用程序,但我一直坚持将 @State var 传递给 ContentView。我在一个结构中声明了@State 变量,在 ContentView 中的变量上有一个@Binding 标记。
我的意图是在 ContentView 中调用 NumberBlock 的多个实例,并且能够通过一个按钮将它们全部重置为 false(隐藏所有图像)。
Xcode 12 中添加的新“App”结构会因缺少参数而出错。我已经尝试了所有我能想到的输入参数,但似乎没有任何效果。我可以通过使用 .constant(true) 来消除错误,但这并没有提供我需要的功能,即从 ContentView 切换变量。
感谢任何帮助消除错误或纠正我对@State 和@Binding 的浅薄理解。
这里是我创建@State reset_x var的地方
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)")
}
}
}
}
还有 .isHidden 扩展名
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 中的图像。如果您单击该图像,它应该再次被隐藏。如果你点击“重置分数”,所有 Numberblocks 中的所有图像都应该被隐藏。
-
是的,完全正确