import SwiftUI
struct RatingStars: View {
@State var starState : Int
var body: some View {
HStack{
ForEach(0..<starState){ index in
Button{
self.starState = index
} label :{
Text("★")
.font(.system(size: 30))
}
}
ForEach(0..<5-starState){ index in
Button{
self.starState = index
} label :{
Text("☆")
.font(.system(size: 30))
}
}
}.padding()
}
}
在此處輸入影像描述
我正在實作一個用戶界面,當按下第二顆星時會填充兩顆星。
我期望在 starState 變數更改時重新繪制視圖。
現在,當我按下星號時,我的代碼并沒有太大變化。有什么問題?
uj5u.com熱心網友回復:
使用ForEach時需要提供可識別的物件。在您的情況下,您可以使用整數本身,因此ForEach(0..<starState)變為ForEach(0..<starState, id: \.self).
PS:您還有另一個問題:您使用單獨ForEach的 s 將為您提供不同的索引。您可以通過將它們合并為一個來解決這個問題:
ForEach(0..<5, id: \.self){ index in
Button{
self.starState = index
} label :{
let star = index <= starState ? "★" : "☆"
Text(star)
.font(.system(size: 30))
}
}
uj5u.com熱心網友回復:
與@LeoDabus 的答案略有不同,但想法相同:
struct RatingStars: View {
@State var starState = 2
var body: some View {
HStack{
ForEach(0..<5, id: \.self) { index in
Button{
starState = starState == index ? starState - 1 : index
} label :{
index <= starState ? Text("★").font(.system(size: 30)) : Text("☆").font(.system(size: 30))
}
}
}
.padding()
}
}
uj5u.com熱心網友回復:
除了這里已經提到的 ForEach 中缺少識別符號之外,您可以簡單地在文本視圖中添加一個長按手勢,然后 onChange 將您的 starState 設定為index 1. 設定文本字串時,您可以按照@spasbil 的建議使用三元運算子,但使用 less 來解決他的帖子的初始狀態問題:
ForEach(0..<5, id: \.self) { index in
Text(index < starState ? "★" : "☆")
.font(.system(size: 30))
.gesture(LongPressGesture().onChanged { _ in
starState = index 1
})
}
編輯/更新:
如果您也希望能夠切換當前的星星:
struct ContentView: View {
@State var starState : Int
var body: some View {
HStack {
ForEach(0..<5, id: \.self) { index in
Text(index < starState ? "★" : "☆")
.font(.system(size: 30))
.gesture(LongPressGesture().onChanged { _ in
starState = index 1 == starState ? starState - 1 : index 1
})
}
}.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(starState: 1)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/431352.html
