SwiftUI 中如何实现文件导入和导出

news2024/7/6 17:57:28

在这里插入图片描述

文章目录

    • 前言
    • 导入
    • 导出
    • 文件移动
    • 总结

前言

之前谈论了在 SwiftUI 中选择照片和视频的问题。今天我们将学习如何在 SwiftUI 视图中导入和导出文件。通过使用新的 fileImporter 和 fileExporter 视图修饰符,可以很方便实现这个功能。

导入

SwiftUI 框架提供了 fileImporter 视图修饰符,可以轻松启用文件选择功能。完全处理对话框和文件夹之间的导航。接下来让我们看看如何实现。

struct ImportingExampleView: View {
    @State private var importing = false
    
    var body: some View {
        Button("Import") {
            importing = true
        }
        .fileImporter(
            isPresented: $importing,
            allowedContentTypes: [.plainText]
        ) { result in
            switch result {
            case .success(let file):
                print(file.absoluteString)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}

如上面的示例所示,我们将 fileImporter 视图修饰符附加到一个按钮上,该按钮切换导入属性,使用它作为绑定来启用文件选择功能。还使用 fileImporter 视图修饰符上的 allowedContentTypes 参数传递允许的文件类型数组。在完成闭包中,可以处理结果并提取所选文件的 URL。

导出

文件导出的工作方式非常相似,但我们还应该提供要导出的文档。在这种情况下,文档类型应符合 FileDocument 协议。

struct TextDocument: FileDocument {
    static var readableContentTypes: [UTType] {
        [.plainText]
    }
    
    var text = ""
    
    init(text: String) {
        self.text = text
    }
    
    init(configuration: ReadConfiguration) throws {
        if let data = configuration.file.regularFileContents {
            text = String(decoding: data, as: UTF8.self)
        } else {
            text = ""
        }
    }
    
    func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
        FileWrapper(regularFileWithContents: Data(text.utf8))
    }
}

在上面的示例中,我们定义了符合 FileDocument 协议的 TextDocument 类型。正如示例所见,实现了从文件读取纯文本并允许将字符串数据导出到文件。现在,可以使用 fileExporter 视图修饰符导出 TextDocument 类型的实例。

struct ExportingExampleView: View {
    @State private var exporting = false
    @State private var document = TextDocument(text: "")
    
    var body: some View {
        TextEditor(text: $document.text)
            .toolbar {
                Button("Export") {
                    exporting = true
                }
                .fileExporter(
                    isPresented: $exporting,
                    document: document,
                    contentType: .plainText
                ) { result in
                    switch result {
                    case .success(let file):
                        print(file)
                    case .failure(let error):
                        print(error)
                    }
                }
            }
    }
}

如上面的示例所示,使用 fileExporter 视图修饰符来启用文件导出的用户体验。还需要绑定到一个布尔值以呈现对话框。必须传递要导出的文档以及其内容类型。在完成闭包中,可以验证文档是否被正确导出,或检查失败的原因。

文件移动

作为额外的功能,SwiftUI 框架还为我们提供了 fileMover 视图修饰符,为用户提供了文件移动的体验。

struct MovingExampleView: View {
    @State private var moving = false
    let file: URL
    
    var body: some View {
        Button("Move files") {
            moving = true
        }
        .fileMover(isPresented: $moving, file: file) { result in
            switch result {
            case .success(let file):
                print(file.absoluteString)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}

在上面的示例中,使用了 fileMover 视图修饰符向用户展示文件移动对话框。应该传递要移动的文件 URL,并在完成闭包中验证结果。

总结

下面我们总结一下,如何在SwiftUI中实现文件导入和导出,以及文件移动的基本步骤:

  • 导入文件:通过使用fileImporter视图修饰符,您可以方便地启用文件选择功能。这个修饰符允许您定义文件的类型和处理选择后的文件。用户点击"Import"按钮,系统弹出文件选择器,选择后可在闭包中处理文件。

  • 导出文件:通过使用fileExporter视图修饰符,您可以启用文件导出功能。在这种情况下,您需要提供一个符合FileDocument协议的文档类型,该文档类型定义了文件的读取和写入方式。用户可以点击"Export"按钮,选择导出的位置,然后在闭包中处理导出的结果。

  • 文件移动:额外的功能是文件移动,通过fileMover视图修饰符,您可以向用户展示文件移动对话框。您需要传递要移动的文件URL,然后在闭包中验证结果。

这些功能可以帮助您的应用更好地处理文件的导入、导出和移动,提供更好的用户体验。

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

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

相关文章

RAMday9

设置按键中断,按键1按下,LED亮,再按一次,灭;按键2按下,蜂鸣器响,再按一次,不响;按键3按下,风扇转,再按一次,风扇停 代码 do_irq.c #include "key.h" extern…

火狐浏览器页面翻译

打开扩展 扩展搜索tran 点击谷歌快译组件 设置翻译语言 安装完成后即可右键翻译页面

【数据库——MySQL(实战项目1)】(3)图书借阅系统——存储函数

目录 1. 简述2. 功能代码2.1 创建存储函数,根据图书编号查借阅人姓名,并调用该函数查询‘ **小邓在森林** ’已借未还的图书情况;2.2 创建存储函数,计算某借阅人还能借阅的图书数目,学生限额 5 本,教师限额…

两个连续变量乘积线性化——McCormick envelope近似

两个连续变量乘积的形式,可以进行近似线性化转化(没有完全等价的线性化方法)。要说明的是这是一种近似线性化,并不是完全等价,存在一定的误差。转化的方法是,McCormick envelope近似(McCormick …

快速解决“找不到msvcr120.dll无法执行代码”问题,总结5解决方法

计算机已经成为我们生活和工作中不可或缺的一部分。然而,在使用计算机的过程中,我们常常会遇到各种问题,其中之一就是找不到msvcr120.dll文件。这个问题可能会可能导致计算机程序软件,游戏无法正常运行,影响到我们的工…

试图带你一文搞懂transformer注意力机制(Self-Attention)的本质

这篇文章主要想搞懂以下几个问题: 1、什么是自注意力(Self-Attention) 2、Q,K,V是什么 好了废话不多说,直接进入正题 Q,K,V分别代表query,key和value,这很容易让人联想到python的字典数据结构&#xff…

西安交大转子数据集故障诊断(Python代码,MSCNN结合LSTM结合注意力机制模型)

1.运行效果:西安交大转子数据集故障诊断(Python代码,MSCNN结合LSTM结合注意力机制模型)_哔哩哔哩_bilibili 2.环境库版本 如果库版本不一样, 一般也可以运行,这里展示我运行时候的库版本,是为了…

多线程 - 锁策略 CAS

常见的锁策略 此处谈到的锁策略,不局限于 Java,C,Python,数据库,操作系统……但凡是涉及到锁,都是可以应用到下列的锁策略的 乐观锁 vs 悲观锁 锁的实现者,预测接下来锁冲突(锁竞争,两个线程针对一个对象加锁,产生阻塞等待了)的概率是大,还是不大,根据这个冲突的概率,来接下…

30+程序员:如何成为工作领域专家丨IDCF

想要独立完成有一定复杂度的开发和维护工作,或者带领团队完成产品发布、项目交付?要成为研发经理、核心项目负责人? 但又苦于没有丰富的实战经验、或是有经验但是没有可以证明能力水平的认证。 在IT行业,年龄是一个敏感话题。特…

AI一体化运维监控方案助力医院监控体系信息化、智能化

智慧医院是现代医疗领域的新兴概念,是通过先进的物联网技术和新兴技术联合人工智能,实现一体化医院运维监控管理,旨在提升医院的安全性、运行效率和服务质量。 具体方案 1、 视频监控系统 医院可以安装视频监控摄像头,覆盖关键区…

vue-mixin

1.vue中,混入(mixin)是一种特殊的使用方式。一个混入对象可以包含任意的组件配置选项(data, props, components, watch,computed…)可以根据需求"封装"一些可复用的单元,并在使用时根据一定的策略合并到组件的选项中,使用时和组件自…

记录使用vant组件库的Popup的问题

使用过程中,需要实现点击遮罩层不关闭,智能点击关闭按钮或提交按钮才能关闭遮罩层,看了官网要使用close-on-click-overlay属性, 一开始的写法是错误的: close-on-click-overlayfalse 这个写法明显传递的是string, 而官网中明确要求要穿布尔值, 所以需要在前面加冒号 :clos…

【基础篇】三、Flink集群角色、系统架构以及作业提交流程

文章目录 1、集群角色2、部署模式3、Flink系统架构3.1 作业管理器(JobManager)3.2 任务管理器(TaskManager) 4、独立部署会话模式下的作业提交流程5、Yarn部署的应用模式下作业提交流程 1、集群角色 Flink提交作业和执行任务&…

04在命令行中使用Maven命令创建Maven版的Web工程,并将工程部署到服务器的步骤

创建Maven版的Web工程 使用命令生成Web工程 使用mvn archetype:generate命令生成Web工程时,需要使用一个专门生成Web工程骨架的archetype(参照官网看到它的用法) -D表示后面要附加命令的参数,字母D和后面的参数是紧挨着的,中间没有任何其它…

Mac下通过nvm管理node

背景 本地有两个项目,老项目需要用到node 14,新项目需要用node 16,所以只能通过nvm来管理node了 卸载原始的node 我的node是通过官网的.pkg文件安装的,可以通过以下命令进行删除 sudo rm -rf /usr/local/{bin/{node,npm},lib/…

第四篇Android--TextView使用详解

TextView是View体系中的一员&#xff0c;继承自View&#xff0c;用于在界面中展示文字。 基本用法&#xff1a; <TextViewandroid:id"id/textview"android:layout_width"wrap_content"android:layout_height"wrap_content"android:padding&q…

一文带你上手自动化测试中的PO模式!

在UI的自动化测试中&#xff0c;我们需要把测试使用到的数据分离到文件中&#xff0c;如果单纯的写在我们的测试模块里面&#xff0c;不是一个好的设计&#xff0c;所以不管是什么类型的自动化测试&#xff0c;都是需要把数据分离出来的。当然分离到具体的文件里面&#xff0c;…

Arcgis实现Tiff合并

Arcgis实现Tiff合并 现有四幅Tiff影像 打开数据管理工具 输入使用这四幅影像 下面这个就是建立数据库&#xff0c;这个不对 点击确定 合成完毕

Facebook广告账户被封?最全防封及申诉指南

Facebook广告是海外营销的一大利器&#xff0c;但是随着互联网的发展&#xff0c;有部分不法分子正在利用他进行盈利&#xff0c;导致Facebook官方安全审核日益严格&#xff0c;不少卖家遭遇封号问题&#xff01;这篇文章就来教你如何更好地管理 Facebook广告帐户&#xff0c;实…

精品Python的美食推荐系统厨房点餐订餐

《[含文档PPT源码等]精品Python的美食推荐系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.…