gpt4 book ai didi

ios - iOS/iPadOS 中的 SwiftUI + DocumentGroup : how to rename the currently open document

转载 作者:行者123 更新时间:2023-12-05 06:01:59 32 4
gpt4 key购买 nike

我的问题是关于 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 修饰符,我使用 FileManagermoveItem 分配新名称 - 通过简单地“移动”文件新生成的之前的 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com