执行环境

  • 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. 二、angular7的基础知识学习

    <p> hello works </p> <div *ngIf="isShow">我是测试内容</div> <p> &l ...

  2. rman备份/恢复

    全备脚本 cat rman_full.sh #!/bin/bash export ORACLE_BASE=/opt/oracle export ORACLE_HOME=$ORACLE_BASE/pro ...

  3. Java heap size

    今天在性能诊断工作中遇到 Java heap size, 下面是它的相关的概念. 什么是Java heap size ? Java heap size 堆栈大小, 指Java 虚拟机的内存大小.我的理 ...

  4. SQLserver基础--连接查询、联合查询、索引

    一.子查询补充: Exists的用法:select*from haha where exists(select*from bumen where bumen.code=haha.bumen,and b ...

  5. python分别使用多线程和多进程获取所有股票实时数据

    python分别使用多线程和多进程获取所有股票实时数据   前一天简单介绍了python怎样获取历史数据和实时分笔数据,那么如果要获取所有上市公司的实时分笔数据,应该怎么做呢? 肯定有人想的是,用一个 ...

  6. Linux内核调试方法总结之Call Trace

    内核态call trace 内核态有三种出错情况,分别是bug, oops和panic. bug属于轻微错误,比如在spin_lock期间调用了sleep,导致潜在的死锁问题,等等. oops代表某一 ...

  7. Python编程:从入门到实践—列表

    访问列表中的元素 >>> bicycles = ['trek','cannondale','redline','specialized']>>> print(bic ...

  8. Oracle redo与undo浅析

    http://liwenshui322.iteye.com/blog/1488949 一. 什么是redo(用于前滚数据) redo也就是重做日志文件(redo log file),Oracle维护着 ...

  9. HashSet 源码分析

    HashSet 1)HashSet 是基于 HashMap 的 Set 接口实现,元素的迭代是无序的,可以使用 null 元素. 创建实例 /** * HashSet基于HashMap实现 */ pr ...

  10. Html.Partial和Html.RenderPartial和Html.RenderAction区别

    1.Html.Partical 把View页或模板解析成字符串然后输出到渲染页面上 @Html.Partical("viewxxx") 2.Html.RenderPartical则 ...