我的环境:下面的代码是在我公司 iPad 上的 swift Playgrounds 4 中编写的。
项目目标:我正在努力改进学校的课堂管理工具,它基本上是一个纸质交通灯,每个学生都有一个衣夹。我想要一个应用程序,其中我的 28 个学生都由一个按钮代表,每个按钮应该在点击 4 次时从绿色变为黄色,如果再点击三次则变为红色。作为一项不错的功能,按钮选项卡(又名警告)的总数应显示在按钮上。此外,按钮应该以有意义的方式构建(就像我学生的表格;7 x 4 网格)。
到目前为止我的进展:我编写了一个类(学生),并创建了该类的实例来代表我最喜欢的四个学生。我将它们打包到一个数组(学生)中,以便轻松地为每个人创建一个按钮。在此类中,“状态”是学生被警告的次数(已点击按钮),“颜色”应该是相应按钮的颜色。
在撰写本文时,我需要一个变量(col)来处理颜色。我认为这是不必要的,但没有让颜色变化以不同的方式工作。
在网格中构建之后,我为数组中的每个元素(学生)创建一个按钮。在按下按钮时,相应学生的状态和颜色都会更新,并且(出于我未知的原因)列也会更新。
然后按钮的标签显示相应学生的姓名、状态和颜色……是吗?
我此时的问题:状态(如按钮上显示的)仅在颜色更改时更新,并且当更改时,它会更改所有按钮的颜色,而不仅仅是一个按钮的颜色。我希望按钮单独更改颜色,并且标签在每次按下按钮时更新。遗憾的是我还没有找到正确的语法来做到这一点。
我的问题:
如何在我的班级中设置默认颜色(绿色)?
如何说服我的按钮单独改变颜色?
如何让我的标签在 ButtonPress 上更新?
提前致谢!
Code
import SwiftUI
public class student{
public var first: String
public var last: String
public var state: Int
public var color: Color
public init(first: String, last: String, color: Color){
self.first = first
self.last = last
state = Int()
self.color = color
}
}
var John = student(first: "John", last: "Lennon", color: .green)
var Paul = student(first: "Paul", last: "McCartney", color: .green)
var Georg = student(first: "Georg", last: "Harrison", color: .green)
var Ringo = student(first: "Ringo", last: "Starr", color: .green)
var students = [John, Paul, Georg, Ringo]
struct ContentView: View {
@State private var col = Color.green
let columnLayout = Array(repeating: GridItem(), count: 7)
var body: some View {
NavigationView{
ScrollView{
LazyVGrid(columns: columnLayout){
ForEach(students, id: \.last) { student in
Button{
student.state += 1
//print(student.state)
if (student.state < 4) {
student.color = .green
}
else if (student.state >= 7){
student.color = .red
}
else {
student.color = .yellow
}
col = student.color
//print(col)
} label:{
ZStack{
RoundedRectangle(cornerRadius: 10, style: .continuous)
.foregroundColor(col)
.aspectRatio(2.0, contentMode: ContentMode.fit)
Text("\(student.first) - \(student.state)")
.foregroundColor(.black)
//.font(.largeTitle)
.scaledToFit()
}
}
}
}
}.navigationTitle("Classroom Management")
}.navigationViewStyle(.stack)
}
}