我想简单地在SwiftUI中的List中添加一行,如insertRowAtindexpathinUIKIT中所示
我做了我应有的研究,发现附加一个部分的工作,而添加一行在部分不工作。
我错过了什么。
密码
import SwiftUI
struct TestList: View {
@State var sections : [SectionModel] =
[
SectionModel(id: 1, rows:
[
RowModel(id: 1, name: "1"),
RowModel(id: 2, name: "2")
]
),
SectionModel(id: 2, rows:
[
RowModel(id: 1, name: "1"),
RowModel(id: 2, name: "2")
]
)
]
var body: some View {
List{
ForEach (sections) { section in
Section(){
ForEach(section.rows) {row in
Button {
addRow() // does not work
addSection() // works
} label: {
Text(row.name)
}
}
}
}
}
}
func addRow() {
sections[0].addRow(row: RowModel.init(id: 10, name: "10"))
}
func addSection() {
sections.append(SectionModel.init(id: 23, rows: [RowModel.init(id: 10, name: "10")]))
}
}
class RowModel : Identifiable{
var id: Int
let name : String
init(id: Int, name: String) {
self.id = id
self.name = name
}
}
class SectionModel : Identifiable{
var id : Int
var rows : [ RowModel]
init(id: Int, rows:[ RowModel]) {
self.id = id
self.rows = rows
}
func addRow (row : RowModel) {
rows.append(row)
}
}
字符串
更新
这是可行的
func addrow() {
var section = sections[0]
section.addRow(row: RowModel.init(id: 10, name: "10"))
sections[0] = section
}
型
我想特别指出的是,
如果直接更改section(即在ForEach中作为数据源引用的section中的项/元素),则在UI中有影响。
如果部分内的任何项目/元素(行)发生变化(第2级元素),则对UI没有影响。
此外,如所选答案中所示,该部分通过按钮单击,更改该部分,因此它可以工作。
Struct或Class与此问题无关。
1条答案
按热度按时间fnx2tebb1#
我们从模特开始吧。正如@ptit-xav所提到的,如果它们是结构体,它们在
SwiftUI
中工作得最好。同样重要的是,id是let
s而不是var
s,因为对象的身份必须是稳定的。字符串
因为
SwiftUI
视图主体只是一个基于模型的计算属性,所以你不能将行添加到表视图本身,但是你必须将它添加到模型中,它将反映在视图中。如果我对您的需求理解正确的话,您将需要像这样的东西来使用户能够创建新行和新部分:型
x1c 0d1x的数据