Xcode 12. 代碼和生命周期都是 Swiftui。
我看過其他人的相關問題,似乎他們只是將整個專案代碼轉儲在這里;從中挑選我需要的東西有點不知所措。所以,我已經把這個問題分解成我能做的最簡單的例子。
目標是在我按下 按鈕時讓 numberX 進行迭代。
提前致謝!
struct InfoData: Identifiable {
var id = UUID()
var nameX: String
var numberX: Int
}
class ContentX: ObservableObject {
@Published var infoX = [
InfoData(nameX: "Example", numberX: 1)
]
}
struct ContentView: View {
@StateObject var contentX = ContentX()
var body: some View {
List(contentX.infoX) { item in
HStack {
Text("\(item.nameX)")
Spacer()
Button(" ") {
item.numberX = 1 //Eror shows up here <<
}
Text("\(item.numberX)")
}
}
}
}
uj5u.com熱心網友回復:
在您使用的語法中,item是一個不可變的值,正如錯誤告訴您的那樣。你不能改變它,因為它并不代表與它來自的陣列的真正連接——它只是一個在List迭代中使用的臨時可讀副本。
如果您可以升級到 Xcode 13,您就可以訪問稱為元素系結語法的內容,List并ForEach允許您執行以下操作:
struct ContentView: View {
@StateObject var contentX = ContentX()
var body: some View {
List($contentX.infoX) { $item in //<-- Here
HStack {
Text("\(item.nameX)")
Spacer()
Button(" ") {
item.numberX = 1
}
Text("\(item.numberX)")
}
}
}
}
這給你一個Binding到item是可變的,讓你改變它的值(一個或多個),并讓它們反映了原始陣列英寸
在 Xcode 13/Swift 5.5 之前,您必須定義自己的方式來更改陣列中的元素。這是一種解決方案:
class ContentX: ObservableObject {
@Published var infoX = [
InfoData(nameX: "Example", numberX: 1)
]
func alterItem(item: InfoData) {
self.infoX = self.infoX.map { $0.id == item.id ? item : $0 }
}
}
struct ContentView: View {
@StateObject var contentX = ContentX()
var body: some View {
List(contentX.infoX) { item in
HStack {
Text("\(item.nameX)")
Spacer()
Button(" ") {
var newItem = item
newItem.numberX = 1
contentX.alterItem(item: newItem)
}
Text("\(item.numberX)")
}
}
}
}
或者,Binding使用自定義的另一個選項:
class ContentX: ObservableObject {
@Published var infoX = [
InfoData(nameX: "Example", numberX: 1)
]
func bindingForItem(item: InfoData) -> Binding<InfoData> {
.init {
self.infoX.first { $0.id == item.id }!
} set: { newValue in
self.infoX = self.infoX.map { $0.id == item.id ? newValue : $0 }
}
}
}
struct ContentView: View {
@StateObject var contentX = ContentX()
var body: some View {
List(contentX.infoX) { item in
HStack {
Text("\(item.nameX)")
Spacer()
Button(" ") {
contentX.bindingForItem(item: item).wrappedValue.numberX = 1
}
Text("\(item.numberX)")
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313639.html
