SwiftUI 8.List介绍和使用
SwiftUI 的 List
组件用于展示可滚动的内容集合,支持静态或动态数据、交互操作(如点击、滑动删除)、分组、自定义样式等。以下是其详细介绍及使用方法:
一、基本用法
1. 静态列表
直接声明固定内容:
struct ContentView: View {var body: some View {List {Text("第一项")Text("第二项")Text("第三项")}}
}
2. 动态列表
结合 ForEach
动态生成列表项:
struct ContentView: View {let items = ["苹果", "香蕉", "橙子"]var body: some View {List(items, id: \.self) { item inText(item)}}
}
- 要求数据元素唯一(通过
id: \.self
或遵循Identifiable
协议)。
二、混合内容
静态和动态内容组合:
List {Text("标题").font(.headline)ForEach(items, id: \.self) { item inText(item)}Section(header: Text("底部")) {Text("其他选项")}
}
三、分组与 Section
使用 Section
对列表内容分组:
List {Section(header: Text("水果"), footer: Text("选择你喜欢的")) {ForEach(fruits, id: \.self) { item inText(item)}}Section(header: Text("蔬菜")) {ForEach(vegetables, id: \.self) { item inText(item)}}
}
.listStyle(.grouped) // 设置分组样式
四、交互与样式定制
1. 点击事件
通过 .onTapGesture
或结合 NavigationLink
:
List(items, id: \.self) { item inText(item).onTapGesture {print("点击了 \(item)")}
}// 或导航跳转
List(items, id: \.self) { item inNavigationLink {DetailView(item: item)} label: {Text(item)}
}
2. 滑动操作(iOS)
添加滑动删除或自定义操作:
List {ForEach(items, id: \.self) { item inText(item)}.onDelete { indexSet in// 处理删除逻辑}.onMove { indices, newOffset in// 处理移动逻辑}
}
.toolbar {EditButton() // 启用编辑模式
}
3. 自定义样式
-
隐藏分隔线(iOS 15+):
.listRowSeparator(.hidden)
-
修改背景颜色:
.listRowBackground(Color.yellow)
-
禁用选中高亮:
.listStyle(.plain)
五、动态数据绑定
结合 @State
或 @ObservedObject
实现数据动态更新:
struct ContentView: View {@State private var items = ["苹果", "香蕉", "橙子"]var body: some View {List {ForEach(items, id: \.self) { item inText(item)}.onDelete(perform: deleteItem)}}func deleteItem(at offsets: IndexSet) {items.remove(atOffsets: offsets)}
}
六、性能优化
1. 懒加载
默认情况下,List
是懒加载的,仅渲染可见项。
2. 使用 Identifiable
协议
确保动态数据遵循 Identifiable
,避免重复计算 id
:
struct Fruit: Identifiable {let id = UUID()var name: String
}List(fruits) { fruit inText(fruit.name)
}
3. 替代方案:LazyVStack
超长列表需谨慎使用 List
(某些场景性能不如 LazyVStack
):
ScrollView {LazyVStack {ForEach(items) { item inText(item.name)}}
}
七、高级功能
1. 下拉刷新(iOS 15+)
添加下拉刷新操作:
List(items) { item inText(item.name)
}
.refreshable {await loadData() // 异步加载数据
}
2. 多选模式(iOS 16+)
启用多选并获取选中项:
struct ContentView: View {@State private var selections = Set<UUID>()let items = [Fruit(name: "苹果"), Fruit(name: "香蕉")]var body: some View {List(items, selection: $selections) { item inText(item.name)}.toolbar {EditButton()}}
}
3. 自定义列表项视图
完全自定义列表项布局:
List(items) { item inHStack {Image(systemName: "leaf")Text(item.name)Spacer()Button("详情") { /* 操作 */ }}.padding().background(Color.gray.opacity(0.1))
}
八、注意事项
- 平台差异:
- iOS:默认带分隔线和点击高亮。
- macOS:支持多列列表和更复杂的交互。
- 性能问题:
- 避免在列表项视图中包含复杂计算。
- 超长列表优先使用
LazyVStack
。
- 唯一性:
- 动态数据必须保证
id
唯一,否则可能导致渲染错误。
- 动态数据必须保证
完整示例
struct Fruit: Identifiable {let id = UUID()var name: String
}struct ContentView: View {@State private var fruits = [Fruit(name: "苹果"),Fruit(name: "香蕉"),Fruit(name: "橙子")]var body: some View {NavigationStack {List {Section(header: Text("水果列表")) {ForEach(fruits) { fruit inNavigationLink {Text("详情:\(fruit.name)")} label: {HStack {Image(systemName: "leaf")Text(fruit.name)}}}.onDelete(perform: delete)}}.navigationTitle("水果").toolbar {EditButton()}.refreshable {await loadMoreData()}}}func delete(at offsets: IndexSet) {fruits.remove(atOffsets: offsets)}func loadMoreData() async {// 模拟异步加载try? await Task.sleep(nanoseconds: 1_000_000_000)fruits.append(Fruit(name: "新水果"))}
}
通过 List
组件,你可以高效实现复杂的数据展示与交互逻辑,同时结合 SwiftUI 的声明式语法,快速构建跨平台的列表界面。
相关文章:
SwiftUI 8.List介绍和使用
SwiftUI 的 List 组件用于展示可滚动的内容集合,支持静态或动态数据、交互操作(如点击、滑动删除)、分组、自定义样式等。以下是其详细介绍及使用方法: 一、基本用法 1. 静态列表 直接声明固定内容: struct Content…...
Android Kotlin ViewModel 错误处理:最佳 Toast 提示方案详解
在 Android Kotlin 的 ViewModel 中显示 Toast 提示需要特殊处理,因为 ViewModel 不应该直接持有 Context(避免内存泄漏),且 UI 操作(如 Toast)必须在主线程执行。以下是几种标准解决方案: 方案…...
Vue 集成 wangEditor5 公式编辑器的实现步骤
Vue 集成 wangEditor5 公式编辑器的实现步骤 1. 安装公式依赖库2. 配置公式编辑器插件3. 启用工具栏公式按钮4. 组件模板与事件绑定功能验证与调试注意事项版本兼容性: 1. 安装公式依赖库 安装 KaTeX 或 kityformula:根据项目需求选…...
go语言八股文(五)
1.go的局部变量是分配在栈上还是在堆上 在Go语言中,局部变量的内存分配(栈或堆)由编译器基于逃逸分析(escape analysis)来决定。以下是总结和具体示例: 栈上分配 当局部变量的生命周期严格限定在函数作用…...
C++ 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例)
使用 C 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例),并且使用 Graphviz 库来生成结果图。 在图论中,“边权之和最小” 是最小生成树(MST)的核心目标,其含义和背景可以从以下几个…...
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介 0. 前言1. OpenCV 安装与配置1.1 安装 Python-OpenCV1.2 配置开发环境 2. OpenCV 基础2.1 图像读取与显示2.2 图像保存 3. 摄像头实时捕获小结系列链接 0. 前言 OpenCV (Open Source Computer Vision …...
pgrep和pkill命令详解
pgrep 与 pkill 命令详解 一、基础功能 命令作用核心机制pgrep根据条件查找进程ID (PID)通过进程名、用户、终端等属性筛选进程,输出匹配的PID列表pkill根据条件终止进程向符合条件的进程发送信号(默认发送SIGTERM,可指定其他信号&am…...
Python----卷积神经网络(卷积为什么能识别图像)
一、卷积的概念 卷积是一种数学运算,通常用于信号处理和图像分析。在卷积神经网络中,卷积操作用于提取输入数据(如图像)中的特征。通过将输入数据与卷积核(滤波器)进行卷积运算,CNN能够识别图像…...
web3.js 和 ethers.js 的核心区别
1. 核心设计理念 ---------web3.jsethers.js开发背景以太坊基金会官方维护独立开发者创建,社区驱动架构风格集中式对象 (web3 为核心)模块化设计(分离 Wallet/Provider/Contract)包体积较大(1MB)更轻量(压…...
Atcoder Help 有关Atcoder 的介绍-1 涨分规则
AtCoder 的 Rating 计算系统基于改进的 Elo 算法,主要包含以下核心机制: 一、基础计算公式 Rating 是「表现分(Performance)」的加权平均值减去衰减函数 f ( n ) f(n) f(n),其中: 新用户初始 f ( 1 ) 1200 f(1)1200 f(1)120…...
Android Studio 中使用 SQLite 数据库开发完整指南(Kotlin版本)
文章目录 1. 项目准备1.1 创建新项目1.2 添加必要依赖 2. 数据库设计3. 实现数据库3.1 创建实体类 (Entity)3.2 创建数据访问对象 (DAO)3.3 创建数据库类 4. 创建 Repository5. 创建 ViewModel6. 实现 UI 层6.1 创建笔记列表 Activityactivity_notes_list.xmlNotesListActivity…...
K8S学习笔记01
是什么 高可用,可扩展,自动化,容器化,管理多容器 组件 master API server controller manager scheduler etcd node 对应一台机器 负责运行和托管容器化 kubelet container runtime kube-proxy pod 同一个pod内的容器…...
奥威BI+AI数据分析解决方案
在数字化时代,数据已成为企业决策的核心驱动力。随着大数据、云计算、人工智能等技术的快速发展,企业对数据分析的需求日益迫切。奥威BI(Business Intelligence)与AI(Artificial Intelligence)的结合&#…...
第36课 常用快捷操作——用“鼠标右键”退出当前命令
概述 在AD 20软件中,很多的命令都是可以一直连续下去的,比方说放置一个元器件符号,如果你当中不取消的话,那就可以一直执行下去,放完一个接着放下一个,放完一个接着放下一个…… 想要退出这种连续进行的命…...
用Java模拟打字:深入解析 java.awt.Robot 的键盘控制艺术
作为开发者,我们有时会遇到需要自动化用户界面交互的场景,比如自动化测试、脚本编写、或者制作一些辅助工具。而模拟键盘输入,尤其是“打字”,是这类自动化任务中非常基础且常见的一环。 在 Java 中,实现这一目标的利…...
基于STM32、HAL库的ATSHA204A安全验证及加密芯片驱动程序设计
一、简介: ATSHA204A是Microchip公司生产的一款高性能加密认证芯片,主要特性包括: 基于SHA-256哈希算法的安全认证 4.5KB EEPROM存储空间(可配置为密钥存储、OTP区域等) 唯一的72位序列号 支持I2C和单线接口 工作…...
2.2.1goweb内置的 HTTP 处理程序
net/http 使用源码分析 在 Go 语言的 HTTP 服务器里,HTTP handler 是实现了http.Handler接口的对象。该接口定义如下: type Handler interface {ServeHTTP(ResponseWriter, *Request) }ServeHTTP方法接收两个参数: http.ResponseWriter&am…...
vscode以管理员身份运行报错
1. 问题现象 对vscode设置了管理员权限,但是打开文件时报错或闪退。 2. 解决方法 可以看一下官方网址:[Visual Studio Code on Windows](https://code.visualstudio.com/docs/setup/windows#_unable-to-run-as-admin-when-applocker-is-enabled) 2.1 …...
【Unity】 Dropdown默认选择不选择任何选项
你需要新建一个text文本并将其拖入Placeholder里面,这样你就可以在代码里面设置value-1了,从而实现默认为空...
gem5教程 第七章 如何在 gem 5 中运行我自己的程序
首先,您必须决定是否运行完整系统(FS)或系统调用仿真(SE)。 在 gem5 仿真器中,“完整系统仿真(Full System Simulation, FS)”与“系统调用仿真(System Call Emulation, SE)”是两种不同的仿真模式,各自有其特点和适用场景。下面是对这两种模式的比较: 1. 完整系统仿…...
Java实现基数排序算法
1. 基数排序原理图解 基数排序是一种非比较的排序算法,其核心思想是通过将整数按位数切割成不同的数字,然后按每个位数分别比较。具体步骤如下: 1. 确定最大值:找到数组中的最大值,以确定需要处理的位数。 2. 分配到桶…...
Python项目-支持自然语言处理
研究生组-自然语言处理-第一章节 Python学习,数据挖掘基础 项目地址:pythonbook: 人工智能实战——从 Python 入门到机器学习...
科技助力防灾减灾:卫星电话走进应急救援队伍
在自然灾害与突发事件频发的当下,通信保障已成为应急救援的“生命线”。传统地面通信网络易受极端天气、地形环境等因素制约,而卫星通信技术的突破,尤其是国产天通卫星系统与北斗系统的成熟应用,正推动救援通信体系迈入全天候、无…...
Android adb 安装应用失败(安装次数限制)
adb安装应用失败 前言平台安装失败现象解决 前言 Android Debug Bridge (ADB) 是一个功能强大的命令行工具,用于与 Android 设备通信。 安装 APK 文件: 使用命令 adb install <apk文件路径> 可以将 APK 文件安装到设备上。如果需要覆盖安装&…...
100天精通Python挑战总览 | 零基础到应用实战!
目录 ✨ 为什么发起100天挑战?✨整体学习路线规划第一阶段|基础篇(第1天 - 第50天)第二阶段|应用篇(第51天 - 第100天)Web开发篇爬虫篇数据分析篇AI入门篇 🏆为什么这么划分…...
预训练大模型与元训练大模型在医疗AI项目中的选型对比分析
简要版: 以下是对预训练大模型与元训练大模型(基于元学习/Meta-Learning)在医疗AI项目中选型对比的总结表格: 对比维度预训练大模型元训练大模型(基于元学习)技术基础基于海量通用数据预训练,通过微调适配具体任务(如GPT-4、LLaMA)通过元学习框架训练,支持快速适应新…...
【JavaScript】相等运算符、条件运算符
1、相等运算符 (1)(相等) 相等运算符用来比较两个值是否相等,如果相等会返回true,否则返回false <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…...
企业用电管理革新利器 —— Acrel-3000 电能管理系统应用解析
电能,以其方便传输、易于转换、便于控制等特性,早已成为广大企事业单位生产、办公的核心能量来源。在 “双碳” 战略目标的宏大背景下,能源结构转型加速推进,电能清洁、高效、零排放的特点愈发凸显。在能源消费侧,“以…...
学生管理系统审计
1.环境搭建 项目地址: https://gitee.com/huang-yk/student-manage 项目下载到本地后IDEA打开,等待项目加载 配置Maven,修改数据库配置文件 然后启动 访问 2.代码审计 1.垂直越权未授权敏感信息泄露 找到拦截器看看对登录做了什么校验 Override public b…...
OpenGL----OpenGL纹理与纹理缓存区
在现代计算机图形学中,纹理(Texture)是一个至关重要的概念。它不仅可以为几何体表面添加细节和真实感,还可以用于实现各种复杂的视觉效果和数据处理。在OpenGL中,纹理的应用范围非常广泛,从基本的颜色映射到高级的阴影映射、环境映射等。本文将深入探讨OpenGL纹理与纹理缓…...
QT开发技术【qcustomplot 曲线与鼠标十字功能】
一、效果 二、代码 #include "obsersingle.h" #include "ui_obsersingle.h" #pragma execution_character_set("utf-8")右键菜单acion回调 // 适应窗口大小 void ObserSingle::RescaleActionFun::fun(ObserSingle *form) {// 自适应y轴数据范围…...
[特殊字符] 大模型后训练指南:从毛坯引擎到智能助手的进化之路 [特殊字符]️
最近看了MIT 6.S191 2025这个讲座感觉讲的挺好的,然后写了一篇总结,大家感兴趣的话可以直接看视频,链接我放到文章最后。 🎯 讲座核心 这个讲座主要讲的是,当我们有了一个基础的大语言模型(就像刚出厂的毛…...
厚铜pcb生产厂家哪家好?
在为您的项目选择厚铜PCB供应商时,技术实力、生产经验与交付能力是决定产品可靠性的关键。随着新能源汽车、工业电源、5G通信等领域对高电流承载、高效散热的需求激增,厚铜PCB(铜厚3oz以上)的工艺门槛不断提升。本文结合行业头部企…...
【重走C++学习之路】22、C++11语法
目录 一、列表初始化 1.1 {}初始化 1.2 std::initializer_list 二、变量类型推导 2.1 auto 2.2 decltype 三、右值引用和移动语义 3.1 左值与左值引用 3.2 右值与右值引用 3.3 左值引用与右值引用比较 3.4 右值引用使用场景和意义 3.5 move 3.6 完美转发和万能引…...
Spring Security授权管理
授权是Spring Security的核心功能之一,是根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则可正常访问,没有访问的权限时则会被拒绝访问。认证是为了保证用户身份的合法性,而授权则是为了更细粒度地对隐私数据进行划分…...
2025A卷-正整数到Excel编号之间的转换
题目描述 用过 excel 的都知道excel的列编号是这样的: a b c … z aa ab ac … az ba bb bc … yz za zb zc … zz aaa aab aac … 分别代表以下编号: 1 2 3 … 26 27 28 29 … 52 53 54 55 … 676 677 678 679 … 702 703 704 705 … 请写个函数&…...
算法设计与分析(期末试卷)
目录 一、频度计算(15 分) 二、项目工期问题(20 分) 三、TSP 问题的贪心算法(15 分) 四、“秤心如意”(15 分) 五、工作指派问题(20 分) 六、计算复杂度…...
springboot(2.6.13)自定义用户授权管理
1.自定义用户访问控制 a.重写configure(HttpSecurity http)方法 在自定义配置类SecurityConfig中重写 Override protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/deta…...
JavaWeb:vueaxios
一、简介 什么是vue? 快速入门 <!-- 3.准备视图元素 --><div id"app"><!-- 6.数据渲染 --><h1>{{ msg }}</h1></div><script type"module">// 1.引入vueimport { createApp, ref } from https://unpkg.com/vu…...
uniapp常用
1.下载文件带进度提示 <template> <view> <button click"startDownload">下载文件</button> <progress :percent"progress" stroke-width"3" /> </view> </template> <…...
etcd 的安装及使用
介绍 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接 watch 功能,能够及时收到数据变化通知,相较于 Zookeepe…...
uni-app vue3 实现72小时倒计时功能
功能介绍 ,数组项有一个下单时间 ,比如今天下单在72小时内可以继续支付,超过则默认取消订单 页面按钮处 加上倒计时 <!-- 倒计时 --> <text v-if"item.timeLeft > 0">{{ formatTime(item.remaining) }}</text&g…...
【C语言】初阶算法相关习题(二)
个人主页:夜晚中的人海 文章目录 ⭐一、两数之和🏠二、珠玑妙算🎡三、寻找奇数🚀四、截取字符串🎉五、寻找峰值 ⭐一、两数之和 题目描述:两数之和 解题思路: 1.先创建一个动态分配的数组ret&a…...
Flutter 学习之旅 之 Flutter 和 Android 原生 实现数据交互的MethodChanel和EventChannel方式的简单整理
Flutter 学习之旅 之 Flutter 和 Android 原生 实现数据交互的MethodChanel和EventChannel方式的简单整理 目录 Flutter 学习之旅 之 Flutter 和 Android 原生 实现数据交互的MethodChanel和EventChannel方式的简单整理 一、简单介绍 二、Flutter 和 Android 原生之间的数据…...
STM32的SysTick
SysTick介绍 定义:Systick,即滴答定时器,是内核中的一个特殊定时器,用于提供系统级的定时服务。该定时器是一个24位的递减计数器,具有自动重载值寄存器的功能。当计数器到达自动重载值时,它会自动重新加载…...
【JS事件循环机制event-loop】
目录 0、总结1、Event-Loop 概念2、宏任务-微任务3、事件循环执行机制4、调用栈5、示例 0、总结 Tasks execute in order, and the browser may render between them 【宏任务按序执行,浏览器可以在它们之间进行渲染】Microtasks execute in order, and are execut…...
对比N+1查询和关联聚合查询
通常我们管第一种模式叫 “N1 查询”,第二种叫 “关联聚合查询”。下面从几个角度来比较,帮助你做出选择。 1. 性能与资源消耗 方案SQL 语句数网络往返次数数据库负载Java 处理N1 查询(先查项目,再遍历项目查设备状态数ÿ…...
优化 Flutter 应用启动:从冷启动到就绪仅需 2 秒
冷启动序列剖析:冷启动时,Flutter 应用需经历引擎和 Dart VM 初始化、启动 Dart Isolate、渲染第一帧等步骤。Android 和 iOS 系统分别通过启动屏幕和 Storyboard 缓解启动延迟。应用大小、初始化工作、调试模式下的 JIT 编译等因素会影响冷启动时间。优…...
牟乃夏《ArcGIS Engine 地理信息系统开发教程》学习笔记 4-空间分析与高级功能开发
目录 一、核心组件与接口回顾 (一)空间分析基础架构 (二)网络分析模块 二、矢量数据空间分析实战 (一)缓冲区分析 (二)叠加分析(以裁剪为例) 三、栅格…...
UE 滚动提示条材质制作
需要两个贴图 先制作条纹屏闪 这里RGB输出连到alpha,0为白色,到1就为黑色了 因为这个图片是RGB输出代表三个图片,看贴图颜色就知道了,然后把这三个相加一下;链接自发光颜色, 这里设置速度变量 通过网盘分…...