SwiftUI入门 - 7.todo页面-List循环数组
2022-11-20 本文已影响0人
思跃喵
置顶
菜鸟入门,各位大佬轻喷,如有谬误之处欢迎讨论建议,也欢迎各位道友与我同行
“不积跬步,无以至千里;不积小流,无以成江海”
继续
上文中已经实现在设置界面中有一个退出按钮,点击后将弹出登陆弹框
并且退出app后登陆状态也同步消失
那么本文进入TODO页面本身的编写,效果如下:
iShot_2022-11-20_15.18.20.gif实现
TODO List 的基本逻辑:
- 首先有一个数组,里面存储的是所有的todo内容
- 然后用一个List循环这个数组,每一条todo上应有删除的功能
- 顶部应该有一个输入框,可以新增todo,应有一个确认按钮 ( 这些就是之前绑定的内容了 )
实现的代码如下:
import SwiftUI
struct TodoView: View {
// 是否已经登陆
@AppStorage("isLogin") private var isLogin:Bool = false;
// 已经登陆的用户名
@AppStorage("userName") private var userName:String = "";
// todoList 数组,里面是一个字符串
@State private var todoLists:[String] = ["TODO第一条","TODO第二条"];
// 输入框输入的新的TODO
@State private var newItem:String = "";
// 向 todolist 添加一条,并清空填写的todo内容
func addOne(){
// 如果没有填写则退出,避免加一些空的数据上去
if(newItem == ""){
return ;
}
todoLists.append(newItem);
newItem = "";
}
// 从 todolist 里面删除指定的一条
func deleteOne(index:Int){
todoLists.remove(at: index);
}
var body: some View {
VStack{
HStack{
TextField("请输入新的TODO",text:$newItem).onSubmit {
addOne()
}
Button("确认"){
addOne()
}
}.padding()
List{
// Foreach 开始循环 TodoLists 的indices,需要它的索引值,用于删除等
// id 需要为一个 Identifier,可以预见,之后我们自己构造数据类型的时候也需要一个 Identifier
ForEach(todoLists.indices ,id: \.self ){ i in
HStack{
// 字符串拼接,之前已有使用
Text("第\(i+1)条:\(todoLists[i])")
Spacer()
// 删除图标,点击后删除本项
Image(systemName: "trash").onTapGesture {
deleteOne(index: i)
}
}
}
}
}
}
}
struct TodoView_Previews: PreviewProvider {
static var previews: some View {
TodoView()
}
}
具体实现方式的解析如代码中的注释。
总结
-
List
下的Foreach
相当于vue
中的v-for="(item,index) in todoLists"
-
Methods
可以直接写在 结构体中,变量也可以直接使用,这与vue3
的setup script
比较类似 - onClick 事件,改为了 onTapGesture 事件。