基于 SwiftUI 创建一个可删除、可添加列表项的列表
执行环境
- 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 创建一个可删除、可添加列表项的列表的更多相关文章
- 创建一个MVC解决方案,添加一个控制器后,运行程序报错:”/"未找到服务器
1.创建一个MVC项目,如图
- 基于centos 创建一个stress镜像
最近需要学习docker的Cgroups机制,需要用到stress进行测试,前期工作就是自己创建一个stress镜像. 新建一个 Dockerfile 文件 [vagrant@localhost ~] ...
- 基于python创建一个简单的HTTP-WEB服务器
背景 大多数情况下主机资源只有开发和测试相关人员可以登录直接操作,且有些特定情况"答辩.演示.远程"等这些场景下是无法直接登录主机的.web是所有终端用户都可以访问了,解决了人员权 ...
- 从零开始基于go-thrift创建一个RPC服务
Thrift 是一种被广泛使用的 rpc 框架,可以比较灵活的定义数据结构和函数输入输出参数,并且可以跨语言调用.为了保证服务接口的统一性和可维护性,我们需要在最开始就制定一系列规范并严格遵守,降低后 ...
- 【github课程】创建github仓库和库创建一个版本号,并添加到存储库文件的版本号
首先,需要登录github注册一个帐号:https://github.com/ 注册帐号登录后,.在右上角,"新仓库": 然后会出现例如以下的界面: 仅仅须要输入仓库的名称,描写叙 ...
- C# 直接创建一个DataTable,并为之添加数据(自定义DataTable) 转
DataTable dt=new DataTable("cart"); DataColumn dc1=new DataColumn("prizename",Ty ...
- python 创建一个实例:步骤二 添加行为方法,编写方法
添加方法 class Person(): def __init__(self,name,job=None,pay=0): self.name= name self.job = job self.pay ...
- github怎么创建一个项目,怎么添加一个ssh-key的客户
1.第一步:打开https://github.com/,登陆成功.单击猫图标,进入页面,单击[start a project] 第二步:输入项目名称,选择public公有,不收费的.单击确认成功. 第 ...
- javascript创建一个基于对象的栈结构
上篇博客介绍了基于数组创建一个栈,这是用对象创建一个栈 s1.声明一个Stack类 class Stack { constructor() { this.count = 0; this.items = ...
随机推荐
- C#与.NET Framework c#编程语言,和java是一样的。(c#,java) -->javaweb,asp.net
- setData 机制
解释:setData 函数,用于将数据,从逻辑层发送到视图层,当开发者调用 setData 后,数据的变化,会引起视图层的更新.参数说明 属性 类型 是否必填 描述 data Object 是 这次要 ...
- Java语言基础(方法重载概述和基本使用)
方法重载概述: 在同一个类中,允许存在一个以上的同名方法,只要他们的参数列表不同(即参数类型或者参数个数)即可. 方法重载特点: 1. 与返回值类型无关,只看方法名和参数列表 2. 在调用的时候,虚拟 ...
- onmouseover和onmouseout鼠标移入移出切换图片的几种实现方法
鼠标移入移出图片切换很常见的,那我们就来说说他的写法 第一种方法,也是最简单的一种,在html:里就可实现 <img class="img" src="img/do ...
- 用CSS代码编写简易轮播图
废话不多说,直接上代码 <!doctype html> <html> <head> <title></title> <meta cha ...
- 含有对象的List集合实现字母数字混合排序
List<PageData> varList = [{BOMCode=10A, mantotal=4}, {BOMCode=10B, mantotal=1}, {BOMCode=11A, ...
- Oracle redo与undo浅析
http://liwenshui322.iteye.com/blog/1488949 一. 什么是redo(用于前滚数据) redo也就是重做日志文件(redo log file),Oracle维护着 ...
- Firefox,Chrome使用
Firefox 插件 REDIRECTOR Automatically redirect pages based on user-defined rules. 根据用户定义的规则自动重定向页面的插件. ...
- django 给数据库批量添加数据
from .models import Book import random def index(request): book_list = [] for i in range(1, 101): bo ...
- python-笔记(六)模块操作以及常用模块简介
模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思是说把python代码写到里面,文件名就是模块的名称,例如:model.py model就是模块名称. 什么是包? ...