当前位置: 首页 > news >正文

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的。

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

相关文章:

  • Verilog实现的数字钟
  • 测试记录3:WLS2运行Linux界面
  • 【golang学习之旅】Go中的cron定时任务
  • 扩展 Kafka 集群从三台节点到四台节点的过程
  • C++结合OpenCV进行图像处理与分类
  • 植物大战僵尸杂交版2.0.88最新版安装包
  • 爬虫之反爬思路与解决手段
  • 记录一次jlink连不上cpu的情况
  • 洛谷 CF1969A Two Friends 题解
  • RAG 高效应用指南 :Query 理解
  • Java1.8全套家政上门服务+springboot+ mysql +Thymeleaf 技术架构开发,家政APP系统在线派单,师傅入驻全套商业源码
  • 【TB作品】 51单片机8x8点阵显示滚动汉字仿真
  • html+CSS+js部分基础运用15
  • C# 判断字符串不等于空的示例
  • AdminController
  • 网络传输文件的问题
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【Amaple教程】5. 插件
  • 【css3】浏览器内核及其兼容性
  • co.js - 让异步代码同步化
  • Codepen 每日精选(2018-3-25)
  • js中forEach回调同异步问题
  • js作用域和this的理解
  • Laravel Mix运行时关于es2015报错解决方案
  • Map集合、散列表、红黑树介绍
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • 第十八天-企业应用架构模式-基本模式
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 警报:线上事故之CountDownLatch的威力
  • 蓝海存储开关机注意事项总结
  • 如何合理的规划jvm性能调优
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 一个完整Java Web项目背后的密码
  • 异常机制详解
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​虚拟化系列介绍(十)
  • #if和#ifdef区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (四)图像的%2线性拉伸
  • (一)WLAN定义和基本架构转
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (状压dp)uva 10817 Headmaster's Headache
  • .naturalWidth 和naturalHeight属性,
  • .net 受管制代码
  • .net6Api后台+uniapp导出Excel
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET微信公众号开发-2.0创建自定义菜单
  • /boot 内存空间不够