- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是关于 SwiftUI 的文档组:在 Xcode 中使用一个简单的、基于模板的项目(使用新的多平台、基于文档的应用程序模板),我可以创建新文档、编辑它们等。此外,“外部"应用程序,我可以像这样操作文档文件 - 移动它、复制它、重命名它等等。
默认情况下,所有新文档都使用“无标题”名称进行初始化;在主应用程序入口点,我可以访问文件的 URL:
var body: some Scene {
DocumentGroup(newDocument: ShowPLAYrDocument()) { file in
// For example, this gives back the actual doc file URL:
let theURL = file.fileURL
ContentView(document: file.$document)
}
}
第一个问题:一旦文档“打开”,即当代码在 ContentView
范围内运行时,如何编辑/更改实际文件名? SwiftUI 文档的缺乏使得寻找此类问题的答案变得非常困难 - 我想我已经搜索了整个互联网,但似乎没有人遇到过这类问题,如果他们确实,他们发布的问题没有答案 - 我自己在其他问题上发布了几个问题,甚至没有收到任何评论,更不用说答案了。
我有另一个问题,我认为它有点相关:例如,我在文件应用程序中看到,某些文件类型在被选中时可以在该文件的“信息” Pane 下显示额外的扩展信息(例如示例:视频文件以像素、持续时间和编解码器信息显示尺寸);我的应用程序的文档包含几个值(在保存的数据中),我希望用户能够在文档选择器中“浏览”这些值,而无需打开文件本身,其方式与文件应用程序中描述的类似.
然后我的第二个问题是:这是否可行,如果可行,我至少可以从哪里开始寻找答案?我的猜测是这对于 SwiftUI 本身是“不可能的”,对吗?现在,所以它必须与“常规”Swift 集成?
提前感谢您的指导。
最佳答案
好吧,事情是这样的:我“有点”设法实现了我所追求的目标,尽管它看起来(对我来说)不是最“正确”的方法,而且仍然存在问题与过程 - 尽管目前我将其归咎于(显然已知的)错误的 DocumentGroup
实现,它也导致了其他问题(请 see this question 了解有关该问题的更多详细信息)。
我“有点”设法更改文件名的方式如下面的代码所示:
@main
struct TestApp: App {
@State var previousFileURL: String = ""
var body: some Scene {
DocumentGroup(newDocument: TestDocument()) { file in
ContentView(document: file.$document)
.onAppear() {
previousFileURL = file.fileURL!.path
}
.onDisappear() {
let newFileName = "TheNewFileName.testDocument"
let oldFileName = URL(fileURLWithPath: previousFileURL).lastPathComponent
var newURL = URL(fileURLWithPath: previousFileURL).deletingLastPathComponent()
newURL.appendPathComponent(newFileName)
do {
try FileManager.default.moveItem(atPath: oldURL.path, toPath: newURL.path)
} catch {
print("Error renaming file! Threw: \(error.localizedDescription)")
}
}
}
}
}
它的作用是:在 View 初始化后(在 previousFileURL
中),它通过在 .onAppear< 中分配它,将文档的初始 URL“存储”在状态变量中
修饰符(我这样做是因为我不知道如何获取对 DocumentGroup
闭包中传递的 file
的引用)。然后,通过使用 .onDisappear
修饰符,我使用 FileManager
的 moveItem
分配新名称 - 通过简单地“移动”文件新生成的之前的 URL(实际上应该重命名文件);提供的示例代码使用硬编码字符串 newFileName
,但在我的实际代码中(实际上发布在这里太长了)我从存储在实际文档,它又是一个字符串,应用程序用户可以在文档打开时对其进行编辑(有意义吗?)。
问题
这目前有一个非常烦人的问题:在一组情况下(即,当应用程序刚启动时,并且使用“加号”按钮创建了一个新文档),代码的行为符合我的预期to - 它打开新文档,我可以在其中(使用“内容 View ”)编辑(并存储)将成为文件名的字符串,当我“关闭它”时(使用 NavigationView 上的后退按钮),它会适本地更新文件名,我可以通过在文档浏览器中实际查看文件来确认这一点。
但是......如果我重新打开同一个文件,或者使用另一个文件,或者只是在不关闭应用程序的情况下再次执行创建新文件等的整个过程,那么显然 DocumentGroup
以某种方式将 FileManager
弄乱到 moveItem
操作实际复制文件(使用新名称)但不删除或实际重命名“旧”文件的程度,因此您最终得到两个文件:一个使用新名称,一个使用“旧”/以前的名称。
即使我检查旧文件是否存在,也会发生这种情况:当达到这些条件时,FileManager.default.fileExists
实际上会找到以前的/旧文件,但是当“移动”时它到新名称然后复制它而不是重命名它。奇怪,但我假设这是因为我在上面的链接中提到的(明显的)错误。
希望这能让有更多经验和理解的人得到更好的答案,他们会(希望)在这里分享。
关于ios - iOS/iPadOS 中的 SwiftUI + DocumentGroup : how to rename the currently open document,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67071538/
我已经阅读了几个小时的 rsync 文档,但我无法弄清楚如何向 rsync 传达如何仅重命名(而不是重新上传文件夹及其内容)目标文件夹,当它们在资源。 我正在使用 SSH 连接到目的地,本地文件夹是源
我正在使用 MySQL。这是一个例子,我想将表 A 重命名为 B,那么以下语句之间有什么区别: alter table A rename to B; 还有这个: rename table A to B
当我在解决方案资源管理器中选择文件或目录并按下 F2 键时,我试图让 Visual Studio 重命名文件。但是,我还希望 Visual Studio 在我按 F2 时进行重构重命名,并且我在编辑器
我无法让 objcopy --rename-sym 工作。 在一个新的 Android 项目中,我创建了目录 jni 和文件 stub.c: #include #include "dlog.h" j
MKPinAnnotationView 在 iOS 15 中重命名为 MKMarkerAnnotationView。 在 iOS 14 之前,我将 MKPinAnnotationView 子类化为 c
如果您调用 os.rename提供不存在的文件或目录,OSError通过将其设置为 None 来忽略文件名.这是 2.6 中的错误,已在某些更高版本中修复? 您只需执行以下操作即可重现该问题: pyt
假设我的前面板有 100 个按钮,名称为“按钮 1”...“按钮 100”。如何快速将它们全部重命名为“Push Button 1”...“Push Button 100”? 最佳答案 与 Dave_
考虑下面这个愚蠢的例子 theory meta_all imports Main begin lemma strict_subset: "⟦ A ⊂ B ⟧ ⟹ ∃a ∈ B. a ∉ A" appl
我正在尝试使用以下代码重命名节点,我需要将节点的 ID 和新名称传递给 server.aspx 如何获取节点的新名称 如何将这两个值传递到 server.aspx 页面 谢谢 .bind("re
我需要一个脚本,允许我将文件名剥离到文件夹中的文件,并将文件夹名称应用于文件,并在每个文件名的末尾添加一个递增的数字。 因此文件名在其原始状态下看起来像这样: gdgeregdja34gtj.jpg
以前,在突出显示 Java 文件中的变量名称后使用 ALT+COMMAND+R 组合键将进入重命名重构模式。现在,组合键将突出显示的文本替换为注册商标符号。 如何让组合键进入重命名重构模式而不是插入符
我有一个 Linux Qt 应用程序,它创建了一些 QThreads . 我知道当你创建一个线程时,它会继承父名,当我使用 htop 时我可以看到它。或 ps ax -L . 是否可以通过像 ps a
在处理器中,为什么我们不能简单地增加寄存器的数量,而不是拥有一个巨大的重新排序缓冲区并映射寄存器以解决名称依赖关系? 最佳答案 原因很多。 首先,我们经常设计微架构来执行现有架构的程序。添加寄存器会改
rename如果 newname 指向不同的驱动器,实际上会复制文件(至少在 Windows 10 平台上)。 有没有办法避免这种情况?我希望它在这种情况下失败。 假设我要移动 100 GB 的文件。
从业务角度来看,问题就出在这里 我们有许多人们使用的共享文件夹,我们称之为//shared/the/drive。但是,我们的服务器可能知道这个共享驱动器是其他名称,可能是 //ir83pn3br8mw
我从 XML 文件中读出它们的类别,然后重命名并保存它们的年份。因此,文件“XYZ.xml”现在是“News_2014.xml”。 问题是,从 2014 年开始,有多个 XML 文件的类别为“新闻”。
假设您有一个名为 foo 的文件包含一些确定的字节序列 X ,并且您想自动将其替换为名为 bar 的文件包含一个字节序列 Y .这通常使用 rename() 完成系统调用---在这种情况下,通过调用r
我正在尝试重命名用户指定目录中的一堆文件,但它似乎只在用户指定程序运行的目录时才有效。例如,从命令行运行时: ./a.out 。 “NewName.txt” 将起作用,而 ./a.out .. "Ne
这个问题可能看起来有点奇怪,但我会尝试对用例进行一些争论。 假设您有一个二维(笛卡尔)场的通用实现,其维度为 dim1 和 dim2,坐标为 c1 和 c2。 struct Field2D { s
我正在使用一个 php 应用程序,其中有一行用于移动文件。我将该方法包含在一个 try...catch block 中,因此,如果抛出错误,可以管理回滚系统。但是从未捕获到异常,那么重命名会引发任何类
我是一名优秀的程序员,十分优秀!