SwiftUI 中创建一个自定义文件管理器只需4步!你敢信!?

在这里插入图片描述

概览

在 SwiftUI 中写一个自定义文件内容的管理器有多难呢?

在这里插入图片描述

答案可能超乎小伙伴们的想象:仅需4步!可谓是超级简单!

在本篇博文中,您将学到如下内容:

  • 概览
  • 1. 第一步:定义文件类型
  • 2. 第二步:创建文件新建/编辑界面
  • 3. 第三步:DocumentGroup 为您解忧 !
  • 4. 第四步:快使用系统文件浏览器(System’s Document Browser)
  • 总结

还等什么呢?Let‘s go!go!go!😉


1. 第一步:定义文件类型

为了将 App 无缝集成到文件管理器中,我们首先需要创建自己的文件类型。

根据应用功能的复杂程度,我们的自定义文件类型可以“平静如水”,也可以“惊天动地”。

在这里,我们不想搞得太过复杂而吓跑一些小伙伴们,所以一切从简:

import SwiftUI
import UniformTypeIdentifiersstruct ColorText: Codable{enum ContentColor: Codable, CaseIterable, Identifiable  {case red, green, blue, gray, orangevar color: Color {switch self {case .red:.redcase .gray:.graycase .green:.greencase .blue:.bluecase .orange:.orange}}var id: Color {color}}// 自定义文件中包括文本和文本对应的颜色,仅此而已var text = ""var color = ContentColor.red
}struct PandaTextFile: FileDocument {static var readableContentTypes = [UTType.data]// 文件名var name: String?var content: ColorTextinit(initialText: String = "", color: ColorText.ContentColor = .red) {content = .init(text: initialText, color: color)}// 自定义文件的解码init(configuration: ReadConfiguration) throws {guard let data = configuration.file.regularFileContents else {throw CocoaError(.fileReadCorruptFile)}name = configuration.file.filenamelet decoder = JSONDecoder()let colorText = try decoder.decode(ColorText.self, from: data)content = colorText}// 自定义文件的编码func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {let data = try JSONEncoder().encode(content)return FileWrapper(regularFileWithContents: data)}
}// 为预览而生!
extension PandaTextFile {static var preview: PandaTextFile {.init(initialText: "Hello,大熊猫侯佩!")}
}

如上所示,我们在自定义文件中保存了文本和文本对应的颜色,仅此而已。

2. 第二步:创建文件新建/编辑界面

在自定义文件类型“羽翼丰满”之后,接下来是写一个与其对应的新建和编辑界面。它起到“承上启下” 后面 DocumentGroup 的重要作用:

import SwiftUIstruct NewPandaTextFileView: View {@Binding var document: PandaTextFilevar body: some View {NavigationStack {VStack {TextEditor(text: $document.content.text).font(.title3.weight(.bold)).foregroundStyle(document.content.color.color)Grid(horizontalSpacing: 16) {GridRow {ForEach(ColorText.ContentColor.allCases) { cc incc.color.frame(width: 50, height: 50).border(document.content.color == cc ? .black : .clear, width: 5).onTapGesture {document.content.color = cc}}}}}.padding().navigationTitle("🐼 \(document.name ?? "无名文件")")}}
}struct Preview: View {@State var file = PandaTextFile.previewvar body: some View {NewPandaTextFileView(document: $file)}
}#Preview {Preview()
}

在完成了 NewPandaTextFileView 之后,我们可以立即在 Xcode 预览中一睹它的真容:

在这里插入图片描述

3. 第三步:DocumentGroup 为您解忧 !

有了自定义文件类型和对应的编辑视图之后,我们随即可以将他们和 DocumentGroup “无缝”的连接起来。

在这里插入图片描述
简单来说,DocumentGroup 是一个可以用于打开、创建以及保存文档的 Scene。

我们可以将它直接嵌入到 App 结构中代替 WindowGroup 来构建一个基于文档应用的宏观布局:

import SwiftUI@main
struct DocBasedAppDemoApp: App {var body: some Scene {DocumentGroup(newDocument: PandaTextFile()) { file inNewPandaTextFileView(document: file.$document)}}
}

可以看到:在 DocumentGroup 闭包中我们将之前创建的 NewPandaTextFileView 文件编辑视图作为自定义文档的 editor ,水到自然渠成!Nice!!!

init(newDocument: @autoclosure @escaping () -> Document,@ViewBuilder editor: @escaping (FileDocumentConfiguration<Document>) -> Content
)

4. 第四步:快使用系统文件浏览器(System’s Document Browser)

在用 DocumentGroup “串联”一切之后,我们只差一步!

我们只需要对系统说:“请把我融入您文件浏览器宽广的胸怀中去吧”,即可享受它带给我们关于文档管理上的“解囊相助”。

进入 Xcode 中项目目标的 info 窗口,新建一个名为 “Supports Document Browser” 的键,并将其值设置为 Yes:

在这里插入图片描述

确保操作无误后,最后运行 App 感受一下系统文件浏览器给我们带来的“如虎添翼”:

在这里插入图片描述

仅仅 4 步之后,一个小巧且“五脏六腑俱全”的文件管理器跃然而出了!小伙伴们给自己点一个大大的赞吧!!!棒棒哒💯


更多 SwiftUI 自定义文件管理器的相关实现,请小伙伴们移步如下链接进一步观赏:

  • SwiftUI 实现一个 iOS 上 Files App 兼容的文件资源管理器

总结

在本篇博文中,我们讨论了如何在 SwiftUI 中仅需 4 步就完成一个“麻雀虽小却五脏俱全”的自定义文件管理器,相信学完本课小伙伴们都会受益良多。

感谢观赏,再会!😎

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

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

相关文章

Dockerfile 指令的最佳实践

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 一、FROM 尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像&#xff0c;因为它受到严格控制&#xff0c;体积小&#xff08;目前不到6 MB&#xff09;&#xff0c;同时仍然是一个完整的Linux发行版。 FR…

从主从复制到哨兵模式(含Redis.config配置模板)

文章目录 前言一、主从复制1.概述2.作用3.模拟实践搭建场景模拟实践 二、哨兵模式1.概述2.配置使用3.优缺点4.sentinel.conf完整配置 总结 前言 从主从复制到哨兵模式。 一、主从复制 1.概述 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Red…

0010Java安卓程序设计-ssm基于安卓的掌上校园系统

文章目录 **摘要**目录系统实现5.2管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;…

Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配

Title: Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配 文章目录 I 前言II. 查看 ROS 消息III. Livox ROS 驱动的消息类型IV. 适配修改应用程序V. 总结 I 前言 有时候, 拿到最新的 Livox 激光传感器, 比如 HAP, 原厂也提供了 ROS 驱动支持 livox_ros_drivers2 (htt…

UE蓝图 里的函数,编辑模式在Sequence里执行

在蓝图里创建CustomFunction &#xff0c;把蓝图拖入Sequence &#xff0c;添加事件 即可调用 如果需要在Sequence里K 蓝图里的变量&#xff0c;需要勾上向过场动画公开

JS中Map对象与object的区别

若想了解Map对象可以阅读本人这篇ES6初步了解Map Map对象与object有什么区别&#xff1f;让我为大家介绍一下吧&#xff01; 共同点 二者都是以key-value的形式对数据进行存储 const obj {name:"zs",age:18}console.log(obj)let m new Map()m.set("name&quo…

《深入理解计算机系统》学习笔记 - 第三课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

带负离子的高速吹风筒方案介绍---【其利天下技术】

负离子吹风筒的产品概念&#xff0c;在吹风筒的产品系列里早就存在的。近年来&#xff0c;随着高速风筒的逐渐普及&#xff0c;产品商都开始把这些产品概念带了进来。一方面提升产品的核心竞争力&#xff0c;另一方面也是为了提升产品体验度&#xff0c;给用户带来不一样的产品…

夯实c基础

夯实c基础 区别&#xff1a; 图一的交换&#xff0c;&#xff08;交换的是地址而不是两数&#xff09;无法实现两数的交换。 题干以下程序的输出结果为&#xff08; c  &#xff09;。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

ssh安装和Gitee(码云)源码拉取

文章目录 安装ssh服务注册码云公钥设置码云账户SSH公钥安装git客户端和git-lfs源码获取 安装ssh服务 更新软件源&#xff1a; sudo apt-get update安装ssh服务 sudo apt-get install openssh-server检查ssh是否安装成功 which ssh输出&#xff1a; /usr/bin/ssh启动ssh 服…

虾皮定价公式:如何在Shopee上为您的商品设置合适的价格?

在Shopee这样的电商平台上销售商品&#xff0c;定价是一个至关重要的因素。一个合理的定价策略不仅可以吸引更多的买家&#xff0c;还可以确保您从每个商品中获得足够的利润。虾皮&#xff08;Shopee&#xff09;为卖家提供了一个简化的定价公式&#xff0c;考虑了多个因素&…

浅析AI智能视频监控技术在城市交通中的作用及意义

城市交通作为整个城市的整体脉络&#xff0c;每天都发挥着重要作用&#xff0c;为了最大程度地避免城市交通堵塞、提高城市交通效率&#xff0c;智能视频监控系统发挥了重要作用。具体表现在以下几个方面&#xff1a; 1、交通违规监管&#xff1a;TSINGSEE青犀智能视频监控系统…

【JavaScript】JS——Map数据类型

【JavaScript】JS——Map数据类型 什么是Map?特性Map与Object的比较 map的创建map的属性map相关方法map的遍历 什么是Map? 存储键值对的对象。 能够记住键的原始插入顺序任何值&#xff08;对象或原始值&#xff09;都可以作为键或值。 特性 Map中的一个键只能出现一次&am…

【三维重建】多频外差相位展开(C++实现)

在结构光三维重建中&#xff0c;通过相移法求解出来的相位是包裹相位&#xff08;在 [&#xff0d;π/2,π/2] 间成周期性 &#xff09; 我们想要用相位找到相机与投影仪间的对应像素&#xff0c;就需要进行相位展开&#xff0c;确保每一行的相位值是唯一的。 多频外差是相位…

JVM虚拟机(已整理,已废弃)

# JVM组成 ## 简述程序计数器 线程私有&#xff0c;内部保存class字节码的行号。用于记录正在执行的字节码指令的地址。 线程私有-每个线程都有自己的程序计数器PC&#xff0c;用于记录当前线程执行哪个行号 ## 简述堆 ## 简述虚拟机栈 ## 简述堆栈区别 ## 方法内局部变量是…

SRC挖掘漏洞XSS

Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的…

Ubuntu宝塔面板本地部署轻论坛系统HadSky并远程访问

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

5.C转python

新始: 13.列表可被改变(数据),元组不可被改变(数据),二者皆与C中的数组的大致相同 14.创建列表方法: 1.一个[ ]就是一个空的列表 2.使用list函数来创建列表 如: 15.可以在[ ]内部指定列表的初始值,打印方法: 如: 16.在python中,在同一个列表中,可以放不同类型的变量(也可…

Vector Quantized Diffusion Model for Text-to-Image Synthesis

Vector Quantized Diffusion Model for Text-to-Image Synthesis Shuyang Gu, University of Science and Technology of China, Microsoft, CVPR2022, Cited: 340, Code, Paper 1. 前言 我们提出了用于文本到图像生成的矢量量化扩散(Vector Quantized Diffusion Model&…

银河麒麟服务器部署Prometheus+Grafana

#年薪百万# 一、环境准备 操作系统&#xff1a;Operating System: Kylin Linux Advanced Server V10 (Sword) (X86-64) prometheus&#xff1a;prometheus-2.48.0.linux-amd64 grafana&#xff1a;grafana-enterprise-10.2.2.linux-amd64 node_exporter&#xff1a;node_expor…