如何在SwiftUI中创建全局分数计数器变量
我是编程新手,所以请容忍我 我试图创建一组图像,当用户点击它们时,它们可以做两件事:如何在SwiftUI中创建全局分数计数器变量,swiftui,global-variables,Swiftui,Global Variables,我是编程新手,所以请容忍我 我试图创建一组图像,当用户点击它们时,它们可以做两件事: 更改图像 根据点击的图像,对分数进行加减 图像更改部分工作正常。我正在努力使用加法/减法函数 这两个映像都是从结构创建的,需要更改相同的变量。因此,如果两个图像都未点击,则分数应为零。如果点击两个,分数应该是两。如果其中一个被再次点击,分数将下降到1。它主要统计当前点击的图像数量,并显示图像的“x”版本 我曾尝试使用一些不同的教程作为指导创建ObservieObject和EnvironmentObject,但我
import SwiftUI
import Combine
class ScoreCounter: ObservableObject {
@Published var redCounter: Int = 0
//var yellowCounter: Int = 0
//var greenCounter: Int = 0
//var blueCounter: Int = 0
}
struct ContentView: View {
var body: some View {
//MARK - Red Button Stack
HStack {
NumberView(currentImage: "2red", imageName: "2red", xImageName: "2Xred")
NumberView(currentImage: "3red", imageName: "3red", xImageName: "3Xred")
}
}
}
struct NumberView: View {
@EnvironmentObject var redScoreCounter: ScoreCounter
@State var currentImage: String
@State var imageName: String
@State var xImageName: String
var body: some View {
Button(action: {
self.currentImage = self.currentImage == imageName ? xImageName : imageName
if currentImage == xImageName {
ScoreCounter.redScoreCounter += 1
} else {
ScoreCounter.redScoreCounter -= 1
}
print(ScoreCounter.redScoreCounter)
}) {
Image(currentImage)
}
}
}
在SceneDelegate中:
import UIKit
import SwiftUI
import Combine
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var redScoreCounter = ScoreCounter()
您需要将
EnvironmentObject
推送到SceneDelegate
中的子视图中。重要的部分是在ContentView
上调用.environmentObject(redScoreCounter)
import UIKit
import SwiftUI
import Combine
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var redScoreCounter = ScoreCounter()
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
.environmentObject(redScoreCounter)
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
...
谢谢,这填补了一个空白。然后如何修改NumberView结构中的redScoreCounter变量?如果它被NumberView结构的另一个实例修改,它会保持该值吗?EnvironmentObject被注入到NumberView中,并且只有一个实例。(在ScenedLegate中定义的实例)如果更改EnvironmentObject中的值,并且该值为publishing(@Published),则使用EnvironmentObject的每个视图都将重新绘制。因此,EnvironmentObject在视图之间同步。