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

news2024/11/24 17:16:34

在这里插入图片描述

概览

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

在这里插入图片描述

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

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

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

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


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

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

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

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

import SwiftUI
import UniformTypeIdentifiers

struct ColorText: Codable{
    
    enum ContentColor: Codable, CaseIterable, Identifiable  {
        case red, green, blue, gray, orange
        
        var color: Color {
            switch self {
            case .red:
                .red
            case .gray:
                .gray
            case .green:
                .green
            case .blue:
                .blue
            case .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: ColorText

    init(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.filename
        let 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 SwiftUI

struct NewPandaTextFileView: View {
    @Binding var document: PandaTextFile

    var 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 in
                            cc.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.preview
    
    var 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 in
            NewPandaTextFileView(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.coloradmin.cn/o/1292626.html

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

相关文章

Java毕业设计源码—vue+SpringBoot图书借阅管理图书馆管理系统

主要技术 SpringBoot、Mybatis-Plus、MySQL、Vue3、ElementPlus等 主要功能 管理员模块&#xff1a;注册、登录、书籍管理、读者管理、借阅管理、借阅状态、修改个人信息、修改密码 读者模块&#xff1a;注册、登录、查询图书信息、借阅和归还图书、查看个人借阅记录、修改…

记1次nacos拉取不到配置问题

今天部署1套新的环境&#xff0c;nacos由运维部署完成&#xff0c;提供了3个端口 30820 31558 32239 启动的时候提示 [Nacos Config] config[dataIdredis.yml, groupDEFAULT_GROUP] is empty 我再三确认页面上确实已经配置好了 于是开启debug -401 Client not connected, c…

ubuntu18.04 vscode 安装 vue.volar Vue Language Features (Volar) , vue3 必备插件

直接在vscode 里面下载老是失败&#xff0c;不是网络问题&#xff0c;而是vue.volar插件配置的vscode版本与vscode版本不一致导致出现安装失败 官网下载最新的 vue.volar插件 https://marketplace.visualstudio.com/ 官网搜索 vue.volar 然后打开 Vue Language Features (Vol…

class036 二叉树高频题目-上-不含树型dp【算法】

class036 二叉树高频题目-上-不含树型dp code1 102. 二叉树的层序遍历 // 二叉树的层序遍历 // 测试链接 : https://leetcode.cn/problems/binary-tree-level-order-traversal/ code1 普通bfs code2 一次操作一层 package class036;import java.util.ArrayList; import java…

亿发专业MES制造系统,现代化MES精益制造管理,建设数字化车间

在制造业信息化进程中&#xff0c;车间级信息化一直是薄弱环节&#xff0c;要提升车间自动化水平&#xff0c;可以发展MES技术。 MES&#xff08;制造执行系统&#xff09;强调对车间级的过程进行全面的集成、控制和监控&#xff0c;同时要合理配置和组织所有资源&#xff0c;以…

<软考>软件设计师-3程序设计语言基础(总结)

(一) 程序设计语言概述 1 程序设计语言的基本概念 1-1 程序设计语言的目的 程序设计语言是为了书写计算机程序而人为设计的符号语言&#xff0c;用于对计算过程进行描述、组织和推导。 1-2 程序语言分类 低级语言 : 机器语言&#xff08;计算机硬件只能识别0和1的指令序列)&…

第二十一章总结。。

计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据&#xff0c;编写网络应用程序前&#xff0c;首先必须明确网络协议…

同旺科技 USB TO RS-485 定制款适配器--- 拆解(四)

内附链接 1、USB TO RS-485 定制款适配器 ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11系统32 / 64位&#xff1b; ● 支持Windows RT、Linux、Mac OS X、Windo…

【爬取音乐,并将音乐信息储存到数据库中】

爬取音乐,并将音乐信息储存到数据库中 确定音乐网站的url并分析网站分析二级页面创建数据库使用Xpath解析&#xff0c;进行多层爬取保存信息完整代码结果 确定音乐网站的url并分析网站 分析二级页面 创建数据库 # 创建一个链接对象 conn pymysql.connect(hostmaster, userroo…

浅谈https

1.网络传输的安全性 http 协议&#xff1a;不安全&#xff0c;未加密https 协议&#xff1a;安全&#xff0c;对请求报文和响应报文做加密 2.对称加密与非对称加密 2.1 对称加密 特点&#xff1a; 加解密使用 相同 秘钥 高效&#xff0c;适用于大量数据的加密场景 算法公开&a…

C++——内部类

class A { public:class B//内部类{private:int _b;}; private:int _a; }; int main() {cout << sizeof(A) << endl;return 0; } 概念及特征&#xff1a; 如果一个类定义在另一个类的内部&#xff0c;这个类就叫内部类。注意此时这个内部类是一个独立的类&#x…

EarCMS 前台任意文件上传漏洞复现

0x01 产品简介 EarCMS是一个APP内测分发系统的平台。 0x02 漏洞概述 EarCMS前台put_upload.php中,存在pw参数硬编码问题,同时sql语句pdo使用错误,没有有效过滤sql语句,可以控制文件名和后缀,导致可以任意文件上传。 0x03 复现环境 FOFA:app="EearCMS" 0x0…

UEFI下Windows10和Ubuntu22.04双系统安装图解

目录 简介制作U盘启动盘并从U盘启动电脑安装系统安装Windows系统安装Ubuntu 附录双系统时间不一致 简介 传统 Legacy BIOS主板下的操作系统安装可参考本人博客 U盘系统盘制作与系统安装&#xff08;详细图解&#xff09; &#xff0c;本文介绍UEFI主板下的双系统安装&#xff…

JavaSE语法之五:数组的定义与使用(超详解!!!)

文章目录 一、数组的概念1. 什么是数组2. 数组的创建及初始化3. 数组的使用3.1 数组中元素的访问3.2 遍历数组 二、数组是引用类型1. 初始JVM的内存分布2. 基本类型变量与引用变量的区别3. 引用变量4. 认识null 三、数组的应用场景1. 保存数据2. 作为函数的参数2.1 参数传基本类…

【从零认识ECS云服务器 | 快速上线个人网站】阿里云手动搭建WordPress网站

第一步&#xff1a;部署 LAMP/LNMP 环境&#xff0c;需要在ECS实例中安装操作系统&#xff08;Linux&#xff0c;本例中使用的操作系统版本为CentOS 7.9 64位&#xff09;、Web服务器软件&#xff08;Apache/Nginx&#xff09;、数据库软件&#xff08;MySQL&#xff09;、网站…

Linux(16):认识系统服务(daemons)

什么是 daemon 与系统服务 【服务】一般的说明是【常驻在记体体中的程序&#xff0c;且可以提供一些系统或网络功能&#xff0c;那就是服务】。而服务一般的英文说法是【service】。 简单的说&#xff0c;系统为了某些功能必须要提供一些服务(不论是系统本身还是网络方面)&…

Makefile语法

一、Makefile规则格式 Makefile 里面是由一系列的规则组成的&#xff0c;这些规则格式如下&#xff1a; 目标…... : 依赖文件集合…… 命令 1 命令 2 ……参考上一节gcc编译器与Makefile入门参考这条规则 1 main: main.o input.o calcu.o2 gcc -o main main.o input.o c…

Windows 基于 VMware 虚拟机安装银河麒麟高级服务器操作系统

前言 抱着学习的态度研究一下麒麟系统的安装 银河麒麟&#xff08;KylinOS&#xff09;原是在“863计划”和国家核高基科技重大专项支持下&#xff0c;国防科技大学研发的操作系统&#xff0c;后由国防科技大学将品牌授权给天津麒麟&#xff0c;后者在2019年与中标软件合并为…

【Java基础篇 | 面向对象】—— 聊聊什么是接口(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 关于接口的简单的介绍…

七、Linux服务器集群搭建

详见《Linux服务器集群搭建》 【往期回顾】 一、Linux系统概述和安装 二、Linux基础命令 三、Linux高级命令 四、虚拟机网络配置 五、Linux基础软件安装 六、shell编程