如何在SwiftUI中创建全局分数计数器变量

如何在SwiftUI中创建全局分数计数器变量,swiftui,global-variables,Swiftui,Global Variables,我是编程新手,所以请容忍我 我试图创建一组图像,当用户点击它们时,它们可以做两件事: 更改图像 根据点击的图像,对分数进行加减 图像更改部分工作正常。我正在努力使用加法/减法函数 这两个映像都是从结构创建的,需要更改相同的变量。因此,如果两个图像都未点击,则分数应为零。如果点击两个,分数应该是两。如果其中一个被再次点击,分数将下降到1。它主要统计当前点击的图像数量,并显示图像的“x”版本 我曾尝试使用一些不同的教程作为指导创建ObservieObject和EnvironmentObject,但我

我是编程新手,所以请容忍我

我试图创建一组图像,当用户点击它们时,它们可以做两件事:

  • 更改图像
  • 根据点击的图像,对分数进行加减
  • 图像更改部分工作正常。我正在努力使用加法/减法函数

    这两个映像都是从结构创建的,需要更改相同的变量。因此,如果两个图像都未点击,则分数应为零。如果点击两个,分数应该是两。如果其中一个被再次点击,分数将下降到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在视图之间同步。