SwiftUI基础学习日记(十)List列表

224 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

大家好,我是小黑,一个还没秃头的程序员~~~

每个应用中都少不了列表,今天介绍的就是显示列表的List组件,效果如下:

image.png

话不多说,正文开始:

(一)List

List 是一种容器,将数据行排列在一列中。

创建List有以下几种方式:

  1. 直接创建具有给定内容的列表。init(content)
  2. 创建一个列表,该列表根据底层数据标识符的键路径标识其行
init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, rowContent: (Data.Element) -> RowContent)

3.创建一个列表,该列表根据到基础数据标识符的键路径标识其行,允许用户选择多个行。selection的值为非数组则允许用户选择单行

init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element) -> RowContent)

4.创建一个列表,该列表根据可识别数据的基础集合的需要计算其行。

init<Data, RowContent>(Data, rowContent: (Data.Element) -> RowContent)

5.创建一个列表,该列表按需计算固定范围内的视图。

init<RowContent>(Range<Int>, rowContent: (Int) -> RowContent)

其他方式也可以使用上述方式进行搭配组合,比如可在范围内计算行并允许用户选择多行等等

可以配合foreach进行数据的展示

下面的例子中将使用foreach展示一个数组数据

struct ListComponent: View {

    @State private var fruits = [

        "Apple",

        "Banana",

        "Papaya",

        "Mango"

    ]

    @Environment(\.presentationMode) var presentationMode

    var body: some View {

        List {

            ForEach(

                fruits,

                id: \.self

            ) { fruit in

                Text(fruit)

            }.onDelete(perform: { indexSet in

                self.fruits.remove(at: 0)

            })

            .onMove(perform: { indices, newOffset in

                print(indices,newOffset)

            })

        }

        .navigationTitle("List").navigationBarTitle("List")

        .navigationBarBackButtonHidden(true)

        .navigationBarItems(leading: Button(action: {

            self.presentationMode.wrappedValue.dismiss()

        }, label: {

            Text("返回")

        }),trailing: EditButton())

        .navigationBarTitleDisplayMode(.inline)

    }

}

这里面用到了foreach的两个修饰符:

  1. onDelete(perform:):为动态视图设置删除操作。
  2. onMove(perform:):为动态视图设置移动拖拽操作。

foreach中的id,此处设置成了self数据本身,但是这里的数据不一定是不同的数据,如何确保设置的id为唯一值,可以使类继承Identifiable协议,将其中的一个属性设置成UUID,这一步是必须的,否则会报错,提示找不到有唯一值的属性

代码如下:

struct NoteModel: Identifiable{
    var id = UUID()
    var title : String=""
    var content : String=""
    var createTimeStamp:String="0"
    var updateTimeStamp:String="0"
    
}

其中的id属性就是唯一值,foreach中可以将id设置成.id,代码如下:

ForEach(self.sqliteViewModel.noteList, id: \.id) { item in
                            listModelItemview(item: item,orderbyIndex: self.$orderbyIndex)
                        }

今天的swiftUI学习分享就到这里,后面我会持续输出iOS开发笔记,感谢大家的阅读!