持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
大家好,我是小黑,一个还没秃头的程序员~~~
每个应用中都少不了列表,今天介绍的就是显示列表的List组件,效果如下:
话不多说,正文开始:
(一)List
List 是一种容器,将数据行排列在一列中。
创建List有以下几种方式:
- 直接创建具有给定内容的列表。init(content)
- 创建一个列表,该列表根据底层数据标识符的键路径标识其行
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的两个修饰符:
- onDelete(perform:):为动态视图设置删除操作。
- 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开发笔记,感谢大家的阅读!