xcode 如何在SwiftUI列表中添加一行,其中包含节

e0uiprwp  于 2023-08-07  发布在  Swift
关注(0)|答案(1)|浏览(104)

我想简单地在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与此问题无关。

fnx2tebb

fnx2tebb1#

我们从模特开始吧。正如@ptit-xav所提到的,如果它们是结构体,它们在SwiftUI中工作得最好。同样重要的是,id是let s而不是var s,因为对象的身份必须是稳定的。

struct RowModel: Identifiable {
    
    let id = UUID()
    let name: String
    
    init(name: String) {
        self.name = name
    }
}

struct SectionModel : Identifiable{

    let id = UUID()
    var rows : [RowModel]
 
    init(rows: [RowModel] = [RowModel]()) {
        self.rows = rows
    }
    
    mutating func add(row: RowModel) {
        rows.append(row)
    }
}

字符串
因为SwiftUI视图主体只是一个基于模型的计算属性,所以你不能将行添加到表视图本身,但是你必须将它添加到模型中,它将反映在视图中。如果我对您的需求理解正确的话,您将需要像这样的东西来使用户能够创建新行和新部分:

struct TestList: View {
    
    @State var sections : [SectionModel] = [
        SectionModel(
            rows: [
                RowModel(name: "row 1"),
                RowModel(name: "row 2")
            ]
        ),
        SectionModel(
            rows: [
                RowModel(name: "row 1"),
                RowModel(name: "row 2")
            ]
        )
    ]
    
    var body: some View {
        List{
            // existing sections
            ForEach (sections) { section  in
                Section {
                    // existing rows
                    ForEach(section.rows) {row in
                        Text(row.name)
                    }
                    // last row is a button that lets the user create new rows
                    Button {
                        addRow(in: section)
                    } label: {
                        Text("Add row")
                    }
                }
            }
            //last section is a button that lets users create new sections
            Button(action: addSection) {
                Text("Add section")
            }
        }
    }

    func addRow(in section: SectionModel) {
        guard let index = sections.firstIndex(where: { $0.id == section.id }) else { return}
        sections[index].add(row: RowModel(name: "new row"))
    }

    func addSection() {
        sections.append(SectionModel())
    }

}


x1c 0d1x的数据

相关问题