SwiftUI(十)- 列表(分组,折叠)

引言

SwiftUI中的List组件不仅可以用户创建简单的列表,和UITableView一样,它也支持分组和折叠功能,让数据展示更具层次感。通过分组功能,我们可以将数据按照特定的逻辑进行组织,而折叠则为用户提供了更为紧凑的界面体验。在本篇博客中我们将探讨如何在SwiftUI中构建分组列表,并实现数据折叠,从而提升列表视图的可读性与用户交互体验。

为列表添加分组

SwiftUI的列表视图支持分组和分组头视图,就像UIKit中的UITableView一样。要进行单元格的分组首先我们需要先放置一个Section视图,还可以有选择的添加组头和组尾视图。

下面我们来创建一个简单的分组列表,一组用来显示动物,一组用来显示植物,代码如下:

struct ContentView: View {/// 动物@State private var animals = ["猫","狗","猪"]/// 植物@State private var plants = ["花","草","树"]var body: some View {List {Section {ForEach(animals,id:\.self) { animal inAnimalView(name: animal)}} header: {Text("动物开始 ")} footer: {Text("动物结束")}Section {ForEach(plants,id:\.self) { plant inPlantView(name: plant)}} header: {Text("植物开始 ")} footer: {Text("植物结束")}}}
}

其中的AnimalView和PlantView均为自定义的视图,代码如下:

struct AnimalView:View {@State var name:Stringvar body: some View {HStack {Circle().fill(.red).frame(width: 20.0,height: 20.0)Text(name)}}
}

struct PlantView:View {@State var name:Stringvar body: some View {HStack {Rectangle().fill(.green).frame(width: 20.0,height: 20.0)Text(name)}}
}

创建一个分组列表

SwiftUI中的列表就像UITableView一样也支持分组样式和普通样式,上面我们创建的为默认的普通样式,如果我们需要使用分组的样式,可以在列表上使用.listStyle(.grouped)修饰符。代码如下:

struct ContentView: View {/// 动物@State private var animals = ["猫","狗","猪"]/// 植物@State private var plants = ["花","草","树"]var body: some View {List {Section {ForEach(animals,id:\.self) { animal inAnimalView(name: animal)}} header: {Text("动物开始 ")} footer: {Text("动物结束")}Section {ForEach(plants,id:\.self) { plant inPlantView(name: plant)}} header: {Text("植物开始 ")} footer: {Text("植物结束")}}.listStyle(.grouped)}
}

效果如下:

创建一个可折叠列表

在复杂数据展示中,折叠列表是一种非常实用的设计,尤其是在需要按类别显示数据时。通过折叠和展开分组内容,用户可以更灵活地浏览信息,而不必一次性显示所有项目。在SwiftUI中,我们可以利用@State变量来跟踪每个分组的折叠状态,结合点击事件动态切换列表的显示效果。通过这样的设计,用户不仅能够直观地查看和管理分组内容,还可以享受到简洁、流畅的交互体验。

下面我们就来实现一个可折叠的分组列表,代码如下:

struct ContentView: View {// 用于跟踪各个分组的折叠状态@State private var isSectionExpanded: [String: Bool] = [:]// 假设有一些分组数据let groupedItems: [String: [String]] = ["Fruits": ["Apple", "Banana", "Orange"],"Vegetables": ["Carrot", "Broccoli", "Cucumber"]]var body: some View {List {ForEach(groupedItems.keys.sorted(), id: \.self) { section inSection(header: Text(section).onTapGesture {// 切换分组的折叠状态isSectionExpanded[section]?.toggle()}) {if isSectionExpanded[section] ?? true {ForEach(groupedItems[section]!, id: \.self) { item inText(item)}}}}}.onAppear {// 初始化每个分组的折叠状态groupedItems.keys.forEach { key inisSectionExpanded[key] = true // 默认展开}}}
}

效果如下:

这段代码相对之前的可能有一点复杂,但是分解开来其实每一行都是我们之前博客中讲解到的内容。

  1. isSectionExpanded:一个字典,用于跟踪每个分组的折叠状态,key 为分组名。
  2. onTapGesture:点击分组标题时切换 isSectionExpanded 的布尔值,以此控制分组内容的显示或隐藏。
  3. ForEach:根据分组的状态,条件性地显示分组中的内容。
  4. onAppear:这个我们还没有介绍到,它视图的生命周期方法,和UIKit中的含义相同,当视图出现时就会执行它的闭包。

结语

在SwiftUI中,通过对列表添加分组和折叠功能,我们可以更好地组织和展示复杂的数据结构。分组让内容层次更加清晰,而折叠功能则使得界面更加简洁、易于浏览。希望通过这篇介绍,能帮助你在项目中灵活运用这些特性,提升用户的操作体验。随着SwiftUI的不断更新,我们可以期待更多更强大的UI组件,使得开发更加高效便捷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469178.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表(Linkedlist)

序言 我们都了解链表是一种数据的存储结构,在Java使用中逻辑与c,c语言数据结构别无二致,但主要由于Java中不存在指针的说法,从而导致在实现过程中的代码不同,所以在学习的过程中我们无需过于担心,逻辑都是…

JS之正则表达式

一、什么是正则表达式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </…

MySQL数据库:本地部署数据库以及安装彩虹猫【Navicat】

文章目录 一.安装前准备工作1.下载并解压文件2.修复电脑缺失的文件 二.本地部署MySQL1.先解压mysql-8.0.25-winx64.zip&#xff0c;并把文件放到安装需要的位置&#xff0c;再把my.ini文件放到mysql-8.0.25-winx64的根目录2.修改注册表的根目录信息为自己的安装装路径3.进命令符…

11个简单易用的电商购物车设计案例

文章目录 前言正文1.扁平化设计购物车2.无表格布局购物车3.美食购物车4.响应式购物车5.jQuery购物车6.动态价格更新购物车7.标签式滑动购物车8.动态商店与购物车一体化设计9.简约清爽的购物车设计10.基于Vue.js的购物车11.域名购物车 总结 前言 现在的电子商务网站&#xff0c…

Stable Diffusion Web UI - ControlNet 姿势控制 openpose

openpose 是 ControlNet 中常用的控制模式之一。 通过 openpose 可以锁定人物姿势&#xff0c;把姿势信息传递给 Stable Diffusion 扩散模型&#xff0c;让其在扩散生成图片的时候遵照特定的任务姿势。 通过 openpose 能够得到类似如下效果&#xff1a; 同样的姿势&#xff0…

Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明;Skip-gram模型实现词嵌入;热编码(One-Hot Encoding)和词向量;

目录 Word2Vec Word2Vec,此向量维度,以及训练数据集单条数据的大小,举例说明 一、Word2Vec的词向量维度 二、训练数据集单条数据的大小 综上所述 热编码(One-Hot Encoding)和词向量 一、表示方式 二、维度与计算效率 三、语义捕捉能力 四、举例说明 Skip-gram模…

大模型预训练+微调大模型;大模型提示/指令模式”(Prompt/Instruct Mode)

目录 大模型发布版本 大模型参数量 预训练+微调大模型 预训练大模型的优势 微调的概念与过程 微调的优势 应用场景与案例 提示/指令模式”(Prompt/Instruct Mode) Prompt模式与Instruct模式的区别与联系 Prompt/Instruct模式的应用优势 应用案例 大模型发布版本 大…

WPF在MVVM模式下怎么实现导航功能

在mvvm的模式下wpf通过frame实现页面跳转_哔哩哔哩_bilibili 视频讲解同步可观看 如下图&#xff0c;我们要实现点击左侧的菜单&#xff0c;在右侧展示不同的页面 实现代码如下&#xff1a; 一、如何从主窗体跳转到页面。 1、在mainwindow.xaml的菜单栏代码里加入如下代码 …

ubuntu 22.04 server 安装 anaconda3

ubuntu 22.04 server 安装 anaconda3 https://www.anaconda.com/download/success Anaconda Installers wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh 其他的是 默认 Executing transaction: done installation finished. Do you wish to…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来&#xff0c;勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷&#xff0c;勒索攻击形势愈发严峻&#xff0c;已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今&#xff0c;勒索攻击手段日趋成熟、攻击目标愈发明确&#xff0c;模式…

函数式编程Stream流(通俗易懂!!!)

目录 1.Lambda表达式 1.1 基本用法 1.2 省略规则 2.Stream流 2.1 常规操作 2.1.1 创建流 2.1.2 中间操作 filter map distinct sorted limit ​编辑skip flatMap 2.1.3 终结操作 foreach count max&min collect anyMatch allMatch noneMatch …

SDL线程

文章目录 SDL线程相关 SDL线程相关 SDL线程创建&#xff1a;SDL_CreateThreadSDL线程等待: SDL_WaitThreadSDL互斥锁 :SDL_CreateMutex/SDL_DestoryMutexSDL锁定互斥: SDL_LockMutex/SDL_UnlockMutexSDL条件变量:SDL_CreateCond/SDL_DestoryCondSDL条件变量 等待通知: SDL_Con…

【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…

深 度 学 习

神经网络基础 一、逻辑回归( Logic Regression ) 1 问题的模型 模型&#xff1a; 其中xx为输入量&#xff0c;y^​预测量&#xff0c;σ()激活函数。   逻辑回归主要用于二分类问题的拟合&#xff1a;0≤y^P(y1∣x)≤1&#xff0c;σ(z)如图&#xff1a; ​ 问题&#xff…

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…

解线性方程组(二)

实验类型&#xff1a;●验证性实验 ○综合性实验 ○设计性实验 实验目的&#xff1a;进一步熟练掌握用Jacobi迭代法和Gauss-Seidel法解线性方程组的算法&#xff0c;提高编程能力和解算线性方程组问题的实践技能。 实验内容&#xff1a; 1)取初值性x(0)(0,0,0,0)T, 精度要求ε…

ReactPress系列—NestJS 服务端开发流程简介

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;感谢Star。 NestJS 服务端开发流程简介 NestJS 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。它使用 TypeScript&#xff08;但也支持纯 Java…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

运维人员必备的 Mac Zsh 配置技巧

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Flume学习

一、Flume概述 Flume最主要的作用就是&#xff0c;实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 二、Flume基础架构 三、Flume安装部署 配置Flume的前提是要配置好JDK和Hadoop 1.解压 [rootlxm148 soft]# tar -zxvf ./apache-flume-1.9.0-bin.tar.gz -C /…