swiftUI笔记之List实践

简单文字列表

8oQgNf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//
// NotesView.swift
// tableView
//
// Created by junyao on 2023/4/22.
//

import SwiftUI

struct Message: Identifiable {
var id = UUID()
var title: String
var des: String
}

// 定义数组,存放数据
var Messages = [
Message(title: "充当Linux终端", des: "我想让你充当 Linux 终端。我将输入命令,您将回复终端应显示的内容。我希望您只在一个唯一的代码块内回复终端输出,而不是其他任何内容。不要写解释。除非我指示您这样做,否则不要键入命令。当我需要用英语告诉你一些事情时,我会把文字放在中括号内[就像这样]。我的第一个命令是 pwd"),
Message(title: "充当英翻中", des: "下面我让你来充当翻译家,你的目标是把任何语言翻译成中文,请翻译时不要带翻译腔,而是要翻译得自然、流畅和地道,使用优美和高雅的表达方式。请翻译下面这句话:“how are you ?"),
Message(title: "担任面试官", des: "我想让你担任Android开发工程师面试官。我将成为候选人,您将向我询问Android开发工程师职位的面试问题。我希望你只作为面试官回答。不要一次写出所有的问题。我希望你只对我进行采访。问我问题,等待我的回答。不要写解释。像面试官一样一个一个问我,等我回答。我的第一句话是“面试官你好"),
Message(title: "充当旅游指南", des: "我想让你做一个旅游指南。我会把我的位置写给你,你会推荐一个靠近我的位置的地方。在某些情况下,我还会告诉您我将访问的地方类型。您还会向我推荐靠近我的第一个位置的类似类型的地方。我的第一个建议请求是“我在上海,我只想参观博物馆。"),
Message(title: "充当讲故事的人", des: "我想让你扮演讲故事的角色。您将想出引人入胜、富有想象力和吸引观众的有趣故事。它可以是童话故事、教育故事或任何其他类型的故事,有可能吸引人们的注意力和想象力。根据目标受众,您可以为讲故事环节选择特定的主题或主题,例如,如果是儿童,则可以谈论动物;如果是成年人,那么基于历史的故事可能会更好地吸引他们等等。我的第一个要求是“我需要一个关于毅力的有趣故事。"),
]

struct NotesView: View {
var body: some View {
List {
ForEach(Messages) { Message in
Section {
Text(Message.title)
.listRowSeparator(.hidden)
.font(.title3)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(1)
Text(Message.des)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(3)
.padding(1)
}.padding()
}.listRowInsets(EdgeInsets())
}
}
}

struct NotesView_Previews: PreviewProvider {
static var previews: some View {
NotesView()
}
}

列表操作 onDelete & onMove & ContextMenu & ActionSheets

完整实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import SwiftUI
struct Message: Identifiable {
var id = UUID()
var title: String
var last: String
}
// 定义数组,存放数据
var Messages = [
Message(title: "充当英翻中", last: "很好,让我们开始为想要减肥的人设计一个锻炼计划。首先,我们需要了解他们的目标和当前的健身水平。您可以问他们关于以下问题的信息:您的身高、体重和BMI(身体质量指数)是多少?您每周进行多少次有氧运动和力量训练?您每次进行运动的时间是多长?您的饮食习惯是什么?您是否有任何特殊的饮食限制?您的工作和日常活动水平是什么?一旦您了解了他"),
Message(title: "担任私人教练", last: ""),
Message(title: "随便聊聊", last: ""),
Message(title: "随便聊聊", last: ""),
Message(title: "随便聊聊", last: "好的,这是一个小学生的笑话:"),
]
struct DialogueView: View {
@State var messagesItems = Messages
@State var showActionSheet = false

var body: some View {
NavigationView{
List {
ForEach(messagesItems) { Message in
HStack {
Image("dialogue")
.resizable()
.renderingMode(.template)
.foregroundColor(.gray)
.frame(width: 40, height: 40)
VStack {
Text(Message.title)
.foregroundColor(.black)
.listRowSeparator(.hidden)
.font(.system(size: 17).weight(.light))
.frame(maxWidth: .infinity, alignment: .leading)
.padding(1)
Text(Message.last)
.foregroundColor(.gray)
.frame(maxWidth: .infinity, alignment: .leading)
.font(.system(size: 15))
.lineLimit(1)
.padding(1)
}
Image("drag")
.resizable()
.frame(width: 20, height: 20)
}.contextMenu {
Button(action: {
// 点击删除
// self.delete(item: Message)
// 点击打开ActionSheet弹窗
self.showActionSheet.toggle()
}) {
HStack {
Text("删除")
Image(systemName: "trash")
}
}
}
// ActionSheet弹窗
.actionSheet(isPresented: self.$showActionSheet) {
ActionSheet(
title: Text("你确定要删除此项吗?"),
message: nil,
buttons: [
.destructive(Text("删除"), action: {
//点击删除
self.delete(item: Message)
}),
.cancel(Text("取消"))
])
}

}
.onDelete(perform: deleteRow)
.onMove(perform: moveItem)
}
.navigationBarItems(leading:
HStack {
Image(systemName: "trash")
.resizable()
.frame(width: 20, height: 20)
.foregroundColor(.gray)
},trailing:
HStack {
Button("新对话") {
print("Specials tapped!")
}
}
)
}
}
// 滑动删除方法
func deleteRow(at offsets: IndexSet) {
messagesItems.remove(atOffsets: offsets)
}
// 拖动排序方法
func moveItem(from source: IndexSet, to destination: Int) {
messagesItems.move(fromOffsets: source, toOffset: destination)
}
//contextMenu 删除的方法
func delete(item Message: Message) {
if let index = self.messagesItems.firstIndex(where: { $0.id == Message.id }) {
self.messagesItems.remove(at: index)
}
}
}

struct DialogueView_Previews: PreviewProvider {
static var previews: some View {
DialogueView()
}
}

onDelete & onMove
48yxb4

1
2
3
4
5
6
7
8
9
10
11
.onDelete(perform: deleteRow)
.onMove(perform: moveItem)

// 滑动删除方法
func deleteRow(at offsets: IndexSet) {
messagesItems.remove(atOffsets: offsets)
}
// 拖动排序方法
func moveItem(from source: IndexSet, to destination: Int) {
messagesItems.move(fromOffsets: source, toOffset: destination)
}

ContextMenu
hLrB9B

1
2
3
4
5
6
7
8
9
10
11
.contextMenu {
    Button(action: {
        // 点击删除
self.delete(item: Message)
    }) {
        HStack {
            Text("删除")
            Image(systemName: "trash")
        }
    }
}
1
2
3
4
5
6
    //删除的方法
    func delete(item Message: Message) {
        if let index = self.messagesItems.firstIndex(where: { $0.id == Message.id }) {
            self.messagesItems.remove(at: index)
        }
    }

ActionSheets
vV7cEY

1
2
3
4
5
6
7
8
9
10
11
12
13
.contextMenu {
Button(action: {
// 点击删除
// self.delete(item: Message)
// 点击打开ActionSheet弹窗
self.showActionSheet.toggle()
}) {
HStack {
Text("删除")
Image(systemName: "trash")
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
.actionSheet(isPresented: self.$showActionSheet) {
ActionSheet(
title: Text("你确定要删除此项吗?"),
message: nil,
buttons: [
.destructive(Text("删除"), action: {
//点击删除
self.delete(item: Message)
}),
.cancel(Text("取消"))
])
}