执行环境

  • macOS Mojave: 10.14.5
  • xcode: Version 11.0 beta 6 (11M392q)

预览效果

完整代码

import SwiftUI

class Item: Identifiable {
var uuid: Int;
var title: String init(title: String) {
self.title = title
self.uuid = generatteID()
}
} func _generateID() -> () -> Int {
var id = 0 return {
id += 1
return id
}
} var generatteID = _generateID() struct ContentView: View {
@State var list: [Item] = [
Item(title: "A"),
Item(title: "B"),
Item(title: "C"),
Item(title: "D"),
Item(title: "E"),
] func delItemBy(uuid: Int) {
let index = list.firstIndex(where: { $0.uuid == uuid }) if index != nil {
list.remove(at: index!)
}
} func push() {
list.append(Item(title: "F"))
} func remove() {
list.removeLast()
} var body: some View {
NavigationView {
List {
ForEach(list) { item in
Button(action: { self.delItemBy(uuid: item.uuid) }) {
Text(item.title + item.uuid.description)
}
}
}
.navigationBarTitle(Text("List"))
.navigationBarItems(leading: Button(action: { self.push() }) { Text("Append") }, trailing: Button(action: { self.remove()}) { Text("RemoveLast") })
}
}
}

代码剖析

利用闭包创建一个自增长的 ID 生成器

func _generateID() -> () -> Int {
var id = 0 return {
id += 1
return id
}
} var generatteID = _generateID()

定义数据结构

class Item: Identifiable {
var uuid: Int;
var title: String init(title: String) {
self.title = title
self.uuid = generatteID()
}
}
  • Item 实现了 Identifiable 协议,用来在 List 中可循环遍历功能
  • 每次创建这个对象时内部的成员变量 uuid 会调用 generatteID 方法获取自增长的 id

视图部分代码

详解参考注释

struct ContentView: View {
// 使用 @State 属性包裹器,修饰 list 属性,关联视图的关系。
// 修改属性值,视图也会更新
@State var list: [Item] = [
Item(title: "A"),
Item(title: "B"),
Item(title: "C"),
Item(title: "D"),
Item(title: "E"),
] // 删除 list 里的数据
func delItemBy(uuid: Int) {
let index = list.firstIndex(where: { $0.uuid == uuid }) if index != nil {
list.remove(at: index!)
}
} // 追加数据
func push() {
list.append(Item(title: "F"))
} // 删除数据
func remove() {
list.removeLast()
} var body: some View {
// 使用导航视图
NavigationView {
// 定义一个列表
List {
// 循环数据源
ForEach(list) { item in
// 使用按钮,绑定事件
Button(action: { self.delItemBy(uuid: item.uuid) }) {
Text(item.title + item.uuid.description)
}
}
}
.navigationBarTitle(Text("List")) // 设置导航视图的 Title
.navigationBarItems(leading: Button(action: { self.push() }) { Text("Append") }, trailing: Button(action: { self.remove()}) { Text("RemoveLast") }) // 设置顶部的按钮
}
}
}

运行代码

基于 SwiftUI 创建一个可删除、可添加列表项的列表的更多相关文章

  1. 创建一个MVC解决方案,添加一个控制器后,运行程序报错:”/"未找到服务器

    1.创建一个MVC项目,如图

  2. 基于centos 创建一个stress镜像

    最近需要学习docker的Cgroups机制,需要用到stress进行测试,前期工作就是自己创建一个stress镜像. 新建一个 Dockerfile 文件 [vagrant@localhost ~] ...

  3. 基于python创建一个简单的HTTP-WEB服务器

    背景 大多数情况下主机资源只有开发和测试相关人员可以登录直接操作,且有些特定情况"答辩.演示.远程"等这些场景下是无法直接登录主机的.web是所有终端用户都可以访问了,解决了人员权 ...

  4. 从零开始基于go-thrift创建一个RPC服务

    Thrift 是一种被广泛使用的 rpc 框架,可以比较灵活的定义数据结构和函数输入输出参数,并且可以跨语言调用.为了保证服务接口的统一性和可维护性,我们需要在最开始就制定一系列规范并严格遵守,降低后 ...

  5. 【github课程】创建github仓库和库创建一个版本号,并添加到存储库文件的版本号

    首先,需要登录github注册一个帐号:https://github.com/ 注册帐号登录后,.在右上角,"新仓库": 然后会出现例如以下的界面: 仅仅须要输入仓库的名称,描写叙 ...

  6. C# 直接创建一个DataTable,并为之添加数据(自定义DataTable) 转

    DataTable dt=new DataTable("cart"); DataColumn dc1=new DataColumn("prizename",Ty ...

  7. python 创建一个实例:步骤二 添加行为方法,编写方法

    添加方法 class Person(): def __init__(self,name,job=None,pay=0): self.name= name self.job = job self.pay ...

  8. github怎么创建一个项目,怎么添加一个ssh-key的客户

    1.第一步:打开https://github.com/,登陆成功.单击猫图标,进入页面,单击[start a project] 第二步:输入项目名称,选择public公有,不收费的.单击确认成功. 第 ...

  9. javascript创建一个基于对象的栈结构

    上篇博客介绍了基于数组创建一个栈,这是用对象创建一个栈 s1.声明一个Stack类 class Stack { constructor() { this.count = 0; this.items = ...

随机推荐

  1. 2017乌鲁木齐网络赛 J题 Our Journey of Dalian Ends ( 最小费用最大流 )

    题目链接 题意 : 给出一副图,大连是起点,终点是西安,要求你求出从起点到终点且经过中转点上海的最小花费是多少? 分析 : 最短路是最小费用最大流的一个特例,所以有些包含中转限制或者经过点次数有限制的 ...

  2. sh_04_qq号码

    sh_04_qq号码 # 1. 定义一个变量记录 QQ 号码 qq_number = " # 2. 定义一个变量记录 QQ 密码 qq_password = " # 注意:在使用解 ...

  3. Knapsack Cryptosystem

    Knapsack Cryptosystem 超大背包 折半查找 #include<bits/stdc++.h> using namespace std; typedef long long ...

  4. 使用Git上传本地项目到http://git.oschina.net

    本文前言,因倡导开源精神,我也把代码传上了开源社区,可是,当初使用http://git.oschina.net 网站上传代码的时候不知道使用工具.我竟然一个文件一个文件复制粘贴,可费了我好大一个劲儿, ...

  5. Atcoder arc079 D Decrease (Contestant ver.) (逆推)

    D - Decrease (Contestant ver.) Time limit : 2sec / Memory limit : 256MB Score : 600 points Problem S ...

  6. 纯CSS3写一个立方体并在鼠标悬停的时候无限循环旋转

  7. python进行数据库迁移的时候显示(TypeError: __init__() missing 1 required positional argument: 'on_delete')

    进行数据库迁移的时候,显示  TypeError: __init__() missing 1 required positional argument: 'on_delete' 图示: 出现原因: 在 ...

  8. Django路由小知识

    from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^articles/200 ...

  9. Delphi XE2 之 FireMonkey 入门(27) - 数据绑定: TBindingsList: TBindScope

    Delphi XE2 之 FireMonkey 入门(27) - 数据绑定: TBindingsList: TBindScope 如果在编写表达式时, 如果能够随意指认需要的控件就好了(通过 Owne ...

  10. 《图解设计模式》读书笔记5-2 decorator模式

    目录 代码演示 模式的角色和类图 思路拓展 Decorator模式即装饰器模式,就是对类进行装饰,下面通过代码说明. 代码演示 代码展示的内容 有一个类StringDisplay:表示一句话,比如he ...