SwiftUI中ContentUnavailableView的使用(iOS 17、tvOS 17推出的新组件)

iOS 17SwiftUI带来了一个新的组件ContentUnavailableView,它允许我们向用户呈现一个空状态,而不需要创建自定义错误或者无内容视图。

ContentUnavailableView易于使用,可自定义,并且具有用于空搜索状态的预定义视图。

建议在无法显示视图内容的情况下使用它,可以用于网络错误、没有项目的列表、没有返回结果的搜索和其他空状态。

使用ContentUnavailableView主要有两类:

  • 使用内置的Unavailable View。
  • 使用自定义的Unavailable View。

内置Unavailable View

ContentUnavailableView只支持一种内置场景:空搜索结果。我们可以使用ContentUnavailableView毫不费力地呈现一个空的搜索结果视图。包括放大镜图像,“无结果”标签以及获取有效搜索结果的有用说明。
在这里插入图片描述
比如上面的代码,直接调用ContentUnavailableView.search就显示除了右侧的视图,非常简单。
比如我们想显示搜索某某没有结果,就可以像下面这么用。
在这里插入图片描述
我们可以把上面的abc换成我们要搜做的内容。
另外还有一个好处是,ContentUnavailableView会自动翻译成应用程序支持的语言。注意,它只会翻译成应用程序支持的语言。不过笔者没有亲测过。

自定义ContentUnavailableView

ContentUnavailableView不仅用于搜索无结果的显示,也可以用于一些比如无网络,无数据等等的显示。
在初始化的时候我们可以自定义title, image, description等信息。比如下面的这些方法:
在这里插入图片描述
下面是一个无网络的提示:

ContentUnavailableView("No Internet Connection",systemImage: "wifi.slash",description: Text("Please connect to the internet and try again")
)

在这里插入图片描述
除了提供title, image, description等参数,也可以是带闭包的参数。比如下面的初始化方法:

init(@ViewBuilder label: () -> Label,@ViewBuilder description: () -> Description = { EmptyView() },@ViewBuilder actions: () -> Actions = { EmptyView() }
)

我们可以在labeldescription闭包内完全自定义我们想要的东西,包括样式等。

ContentUnavailableView {Text("No Mail").font(.largeTitle).foregroundColor(.black)Text("No Mail").font(.largeTitle).foregroundColor(.red)Image(systemName: "tray.fill")} description: {Text("New mails you receive will appear here.")
}

在这里插入图片描述
在初始化的第一个label闭包内,我们添加了两个Text和一个Image,包括设置了外观样式,这些都是支持的,而且这些添加的组件默认都是竖向排列的。

label闭包和description闭包内随便添加了一些组件,仅供测试了:
在这里插入图片描述
这个初始化方法中还有一个actions参数,允许用户交互一下。

ContentUnavailableView {Label("Empty Bookmarks", systemImage: "bookmark")
} description: {Text("Explore a great movie and bookmark the one you love to enjoy later.")
} actions: {Button("Browse Movies") {// Go to the movie list.}.buttonStyle(.borderedProminent)
}

在这里插入图片描述
actions闭包支持添加多个Button的。

写在最后

虽然可以使用VStackText实现类似的结果,但ContentUnavailableView为处理重复性任务节省了大量时间。此外,它还确保了跨不同平台的一致和吸引人的外观,毕竟我们的App有可能是同时支持iOStvOS以及AppleWatch的。

最后,希望能够帮助到有需要的朋友,如果您觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

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

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

相关文章

【C语言】详解函数(下)(庖丁解牛版)

文章目录 1. 前言2. 数组做函数形参3. 函数嵌套调用和链式访问3.1 嵌套调用3.2 链式访问 1. 前言 详解C语言函数(上)的链接:http://t.csdnimg.cn/EGsfe 经过对函数的初步了解之后,相信大家已经对C语言标准库里的函数已经有初步的认知了,并且还学会了如…

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”,将生产“产品”对象称为“工厂”;如果创建的产品不多,且不需要生产新的产品,那么只需要一个工厂就可以,这种模式叫做“简单工厂”,它不属于23中设计…

nvme-cli常见命令分析

一、背景 nvme-cli命令常常用于获取或者设置SSD参数,比如常见的nvme list,nvme id-ctrl等,都是获取SSD的基本信息,也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者,我们并不知道nvme-cli源码怎么实现…

光波长 深入程度

UV深入程度(UVC, UVB, UVA)https://mp.weixin.qq.com/s?__bizMzkwNTM0Njk3MA&mid2247483934&idx1&sn92d1ba67ead404e7714af11ec0526786&chksmc0f868ebf78fe1fd0610493e6f49a5d90835a20a829a900746906cda12f2fa12…

ultralytics-极市平台打榜

ultralytics 应用教程 ultralytics简介 UltralyticsYOLOv8YOLOv8 基于深度学习和计算机视觉领域的尖端技术,在速度和准确性方面具有无与伦比的性能。其流线型设计使其适用于各种应用,并可轻松适应从边缘设备到云 API 等不同硬件平台。链接 安装教程 作为第三方python包直接…

hcia datacom学习(12):vlan间路由

不同vlan相当于不同网段,如果vlan间没有三层技术,那么它们就无法互相通信。 vlan间路由可以有3种方式: 1.直接使用路由器转发 *路由器本身不需要额外设置,只需配置端口ip作为网关即可。 *路由器不能处理带有vlan标签的数据帧&a…

springboot3 一些听课笔记(1)

文章目录 一、日志框架二、springboot 自动配置三 、springweb3.13.2 自己编写一个messageconvert3.2.2 如果我们想让其支持yaml格式呢? 一、日志框架 springboot底层 默认使用logbacksjf4j作为日志框架。 1、每个 starter 场景,都会导入一个核心场景 …

10_JavaWeb过滤器

文章目录 过滤器1.过滤器的实现1.1 实现过滤器1.2 配置过滤器1.2.1 过滤器的xml方式1.2.2 过滤器的注解方式 2. 过滤器的生命周期3. 过滤器链使用 过滤器 生活举例: 公司前台,停车场安保,地铁验票闸机 java中过滤仅仅是对请求做出过滤 客户端向服务器发出请求,在服…

Jail管理器AppJail的使用@FreeBSD

Jail的简介 Jail是FreeBSD操作系统中一个功能强大的安全机制,自FreeBSD 4.X版本起便投入使用,并且随着系统的发展,其功能、效率、稳定性和安全性得到了持续的强化。 Jail基于chroot的概念,通过更改一系列程序的根目录&#xff0…

基于包围盒的机械臂防碰撞算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 5.完整工程文件 1.课题概述 基于包围盒的机械臂防碰撞算法。在实际情况中,由于很多对象结构较为复杂,当目标对象与障碍物之间的包围盒相交的时候,而两个物体并不相交。这就需要进一步划…

js 一维数组转多维数组

效果图: //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…

springboot项目中第三方jar包打包进jar包

springboot项目中,如果手动引入了jar包,打包时不会将手动引入的第三方jar包打包进价包里,如何处理? 若第三方的jar包的lib和src同级,则maven打包时默认不会将lib下的jar包打包进jar包,处理方式有两种&#…

Golang | Leetcode Golang题解之第133题克隆图

题目: 题解: func cloneGraph(node *Node) *Node {if node nil {return node}visited : map[*Node]*Node{}// 将题目给定的节点添加到队列queue : []*Node{node}// 克隆第一个节点并存储到哈希表中visited[node] &Node{node.Val, []*Node{}}// 广…

nginx --- 反向代理|负载均衡 | 动静分离

目录 反向代理如何配置 1、反向代理实例一 2、反向代理实例二 ocation 指令说明 Nginx 负载均衡 负载均衡常用算法 应用场景 总结 Nginx实现动静分离 一、什么是动静分离 二、实现方案 三、配置Nginx动静分离 四、验证测试 反向代理如何配置 1、反向代理实例一 实…

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小?在数字时代,视频已成为我们日常生活和工作中不可或缺的一部分。然而,随着视频质量的提升,视频文件的大小也随之增加,这给存储和分享带来了不小的挑战。幸运的是,市面上有许多视频压缩软件…

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件,它集成了多种高级功能,为用户带来极致的视频编辑体验。在这篇文章中,我们将详细介绍该软件的功能和特色,帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…

【简单理解化】 内存函数及它的模拟实现

本文章谈论memcpy,memcmp,memmove,memset函数 目录 1.memcpy的使用和模拟实现 2.memmove的使用和模拟实现 3.memset的使用 4.memcmp函数的使用 1.memcpy的使用和模拟实现 该函数用于从源内存块复制指定数量的字节到目标内存块 1 void * memcpy ( void * destination, const voi…

【机器学习基础】Python编程01:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

C++ | Leetcode C++题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n gas.size();int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i …

2.1.3 采用接口方式使用MyBatis

实战概述&#xff1a;使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…