swift 如何将子视图无法更改的数据传递到子视图中

ha5z0ras  于 2023-01-25  发布在  Swift
关注(0)|答案(1)|浏览(148)

我对Swift和SwiftUI非常陌生,并试图找出如何实现以下功能。

  1. ContentView创建两个User对象(播放器和cpu)
  2. ContentView将这些对象传递给子视图ScoreView
  3. ScoreView应打印User中的属性(例如分数和姓名)
    1.当User.score更改时,需要更新ScoreView
    这是我目前所拥有的,并且它工作正常。但是我担心,因为有一个@Binding附加到ScoreView中的变量,它可能会改变值。我希望这个视图将这些值设置为只读。
class User: ObservableObject {
    var name: String
    @Published var score: Int
    
    init(name: String, score: Int) {
        self.name = name
        self.score = score
    }
}
struct ContentView: View {
    
    @StateObject var player = User(name: "Player", score: 0)
    @StateObject var cpu = User(name: "CPU", score: 0)
    
    var body: some View {
        ZStack {
            Image("background-plain").resizable().ignoresSafeArea()
            VStack {
                Spacer()
                Image("logo")
                Spacer()
                HStack {
                    Spacer()
                    ScoreView(name: $player.name, score: $player.score)
                    Spacer()
                    ScoreView(name: $cpu.name, score: $cpu.score)
                    Spacer()
                }
                .fontWeight(.semibold)
                .foregroundColor(.white)
                Spacer()
            }
        }
    }
}
struct ScoreView: View {
    
    @Binding var name: String
    @Binding var score: Int
    
    var body: some View {
        VStack {
            Text(name)
                .font(.headline)
                .padding(.bottom, 10)
            Text(String(score))
                .font(.largeTitle)
        }
    }
}
nlejzf6q

nlejzf6q1#

替换

@Binding var

let

然后从父级中删除$,在父级中删除两者的连接处。
您还应该将User更改为值类型。

struct User {
    var name: String
    var score: Int
    
    init(name: String, score: Int) {
        self.name = name
        self.score = score
    }
}

相关问题