问题标签 [document-based]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - 如何为 QuickTime Player 等基于文档的应用程序实现中间文件类型?
这里有没有人有使用 macOS 上基于文档的应用程序的经验,您可以在其中创建用户无法通过应用程序保存的文档文件类型?具有禁用名称和位置字段的重命名/移动下拉列表?
想先从这个问题开始,然后再解释下面的场景。
我正在尝试为基于文档的应用程序实现中间文件类型。可以把它想象成一个描述媒体编辑/组合的中间项目文件,但如果用户试图关闭窗口,他们将被提示将媒体导出为最终格式(不是中间类型)。
我正在尝试将体验建立在 QuickTime Player 的基础上。在 QuickTime Player 中,如果您打开一个视频,它就像一个查看器,它允许您通过单击标题的下拉菜单重命名/移动文件:
https://i.stack.imgur.com/a5WGr.png [屏幕截图显示来自 QuickTime Player 的重命名/移动下拉菜单]
注意:发现有趣的是,由于某种原因,“锁定”选项被禁用。当我在我的文件中打开文件时,情况并非如此。
现在,当您在 QuickTime 中将另一个视频拖到该视频上时,您创建了这两个视频的合成,并且窗口变为标记为已编辑的无标题文档。这似乎是通过他们使用扩展名 qtpxcomposition 创建的新文档文件类型来完成的。查看 QuickTime Player App 的 plist 显示它们在标识符 com.apple.quicktimeplayerx-composition 和 com.apple.quicktimeplayerx-composition-bundle 下具有两种类型的 QuickTime Player Composition,共享相同的扩展名。它还显示 QuickTime Player App 被设置为这些类型的编辑器。我理解并以相同的方式使用不同的扩展实现了我自己的导出 UTI。我什至在创建该类型的临时文件、打开包含其内容的文档并让它替换当前窗口的情况下都可以正常工作。但是,我发现最大的不同是我的重命名/移动下拉菜单完全启用,这意味着用户可以保存我的中间文件。在 QuickTime Player 上,您可以在此处看到情况并非如此:
https://i.stack.imgur.com/yrCab.png [屏幕截图显示 QuickTime Player 中 qtpxcomposition 文件的重命名/移动下拉菜单]
名称、位置和锁定选项都被禁用。用户只能添加到标签中,因此当打开此重命名/移动下拉菜单时,标签下拉菜单会自动打开。我一直无法弄清楚这是如何完成的。由于它是从文件内容加载的无标题文档,因此如果您右键单击标题(我的标题也是如此),它没有路径,并且您无法重命名/移动它,因为这些选项被禁用. 您会发现文件菜单下的“保存”、“重命名”和“移动到”选项都被禁用,如果您关闭窗口,则会出现一个保存对话框,该对话框会将合成导出为 .mov 文件,如下所示:https ://i.stack.imgur.com/bf5w9.png. 这意味着该应用程序有效地隐藏了用户保存此中间文件的任何真实方式。有谁知道他们是怎么做到的?
根据我的测试,似乎只有在您返回 YES 时才会出现下拉菜单+ (BOOL)autosavesInPlace
,这也是导致在您尝试关闭无标题文档的窗口时出现保存提示的原因。虽然我知道 QuickTime Player 正在为要保存的自动保存设置一个特定位置。即在 /Users/.../Library/Containers/com.apple.QuickTimePlayerX/Data/Library/Autosave 信息中。我仍然需要弄清楚如何正确地将自动保存设置到这样的位置(我的猜测是 via NSURL * autosavedContentsFileURL
),但我不怀疑这与名称和位置字段被禁用的原因有关。
我尝试过的事情包括从 中返回错误,测试从or中checkAutosavingSafetyAndReturnError
返回 YES 或 NO 的内容 ,以及测试锁定文档的想法。然而,这些都没有奏效。其中最重要的是让文件似乎被标记为“锁定”,但用户可以打开该重命名/移动下拉菜单并解锁它。鉴于该文件未在 QuickTime Player 上标记为锁定,我认为锁定它也不是其中的一部分。preservesVersions
autosavesDrafts
我能想到的另一种方法是他们正在访问下拉列表本身并禁用这些文本字段,但我还没有找到任何方法来访问该下拉列表。还没有找到任何可以给我的委托方法或可覆盖的方法。我发现的最接近的东西是在 NSWindow 中,您可以在其中覆盖- (BOOL)window:(NSWindow *)window shouldPopUpDocumentPathMenu:(NSMenu *)menu
,但那个只是指右键单击标题时出现的路径弹出窗口。对于像这样的无标题文档,它已经没有任何作用。
我不确定此时我还能尝试什么,而且我没有任何运气找到其他人在网上询问这种事情。唯一的答案我看到有人在制作该按钮时禁用该下拉菜单返回 nil ,但这不起作用。虽然标题右侧的人字形消失了,但如果您单击标题,它并不会阻止功能仍然发生。
有谁知道这是如何在 QuickTime Player 中完成的?
swift - 使用单个窗口的基于文档的应用程序
我有一个基于文档的 macOS 应用程序,它是一个基本的文本编辑器。默认行为是为每个打开的文档创建一个新窗口。但是我希望一次只显示一个窗口,并且在打开文档或创建新窗口时,这应该发生在同一个窗口中,从而替换旧文档。
我试图通过不实例化新的窗口控制器而是重用旧的窗口控制器来对该makeWindowControllers
方法进行一些黑客攻击。NSDocument
但是在这种方法出现一些问题之后,我认为这不是正确的方法。我想知道是否有解决此问题的通用方法。
这是我尝试过的代码
ios - iOS 14 基于文档的应用程序采用 SceneDelegate?
我最近正在开发一个新的基于文档的应用程序。传统的,到现在为止,官方模板是在 AppDelegate 中实例化一个 UIDocumentBrowser;以及基于文档的应用程序的官方建议使用文档浏览器作为根视图。
然而,作为 iOS 13 以来的多窗口引入了 Scene 并建议应用程序将视图生命周期相关代码迁移到 SceneDelegate。
因此,我想知道,在这种情况下,一个打算支持多窗口的基于应用程序的应用程序应该如何做。你的实际建议是什么?
swiftui - 如何更改基于 SwiftUI 文档的应用程序中的文件名?
我一直在为基于文档的 SwiftUI 应用程序使用新模板。虽然您在新模板中“免费”获得了很多文件管理,但在 iOS 版本中,用户必须退出文件到文件浏览器才能更改文件名。我想为用户创造机会在文件打开时重命名文件。
这是一个专注于该问题的示例项目:https ://github.com/stevepvc/DocumentRenamer
在代码中,我在模板代码中添加了一个带有文本字段的简单 UI,供用户输入新名称。当用户点击“重命名”按钮时,应用程序会检查具有该名称组件的 URL 是否可用,并在必要时附加后缀以创建目标 URL。
然后它会尝试重命名文件,这就是我被卡住的时候。我尝试了几种方法,最近的方法如下:
但我不断收到以下错误:
Domain=NSCocoaErrorDomain Code=513 "您没有将文件 "Untitled" 保存在文件夹 "DocumentRenamer" 中的权限。"
我也试过这个没有 startAccessingSecurityScopedResource() 检查,或者尝试创建一个帮助器类,如下所示:
但是使用这种方法会完全锁定应用程序。那里可能有一些关于 iCloud 权限的事情,但我认为我已经适当地设置了这些权限。
它似乎在模拟器中工作正常,但在设备上运行时却不行。
重命名应用程序容器中文件的正确方法是什么?
xcode - 如何阻止 MacOS 基于文档的应用程序自动加载缓存文件
从 Xcode 启动我的应用程序时,我的基于文档的应用程序显然会自动尝试从以前的启动加载缓存的文档。该文档似乎已损坏,因为应用程序在 initWithCoder [从 readFromData: 中调用] 中崩溃。
解决方案似乎是删除缓存的文档。它们在哪里,删除它们有什么特别之处吗?
swift - NSDocumentController noteNewRecentDocumentURL(_:) 等效于 MacCatalyst
我最近使用 UIKit 为 iOS、iPadOS 和 macOS 构建了一个应用程序。
这个应用程序打开文件(它是一个代码编辑器)。从 Finder 打开文件时,它会出现在最近菜单中,但从应用程序菜单打开文件时,它不会出现。
我想使用NSDocumentController noteNewRecentDocumentURL(_:)
手动添加它,但它在 Mac Catalyst 中不可用。
有什么方法可以将文件添加到 Mac Catalyst 上的最近菜单?
macOS 的文档(仅在 AppKit 中可用,而不在催化剂中可用):https ://developer.apple.com/documentation/appkit/nsdocumentcontroller/1514967-notenewrecentdocumenturl
ios - 启动基于文档的 SwiftUI 应用程序时的入职屏幕
无论如何,在文件选择器屏幕出现之前,在启动基于 SwiftUI 文档的应用程序时显示一个入职屏幕?
我现在可以做的是在用户创建新文件或打开现有文件后UserDefaults
显示入职屏幕,使用:
couchdb - 同步数据库中的访问控制
我有一个使用 Angular 和 PouchDB 构建的离线功能 Web 应用程序,它将数据同步到 CouchDB。在我开始实施访问控制机制之前,此设置运行良好。CouchDB 已经提供了一些开箱即用的功能,允许对每个数据库进行访问控制。
但是,在我的情况下这还不够,因为我什至想拥有每个文档的访问权限。使用 CouchDB 实现此目的的唯一方法是将每个文档放入自己的数据库中,这对于数千个文档以及与它们同步的数千个本地 PouchDB 是相当不切实际的。
问题是,我不能只是在应用程序和数据库之间添加一个后端,因为这会使我失去同步。我找到了实现类似这样的CoverCouch项目,但该项目多年来一直没有维护,而且作者似乎对这个项目的结果也不太满意。
因此,我的问题是,如何在不必自己实现整个同步逻辑的情况下添加访问控制机制?
我知道 PouchDB/CouchDB 堆栈(Realm、Firebase)有替代品,但我需要一个可以自己托管数据库的解决方案(而不依赖于 Google)。
是否有实现CouchDB 复制协议的访问控制后端或解决此问题的替代技术堆栈?
我觉得这是一个非常普遍的问题,除了这个CouchDB PR我找不到任何解决它的方法。
file - 如何从基于 SwiftUI 文档的应用程序中将多个文件保存在包文件夹中?
我正在开发一个基于 SwiftUI 文档的应用程序,其中包含一些易于序列化的数据和多个图像。我想将文档保存为一个包(即一个文件夹),其中一个文件包含易于序列化的数据,一个子文件夹包含图像作为单独的文件。我的包目录应该是这样的:
我创建了一个 FileWrapper 子类,它设置目录结构并适当地添加序列化快照,但是当我在 iOS 模拟器中运行应用程序并单击“+”创建一个新文档时,应用程序通过 PkgFileWrapper init() 运行并write() 没有错误,但没有明显地创建任何东西就返回浏览器窗口。我已经声明导出和导入类型标识符符合“com.apple.package”。任何人都可以建议一种方法来使其正常工作吗?
PkgFileWrapper 类如下所示:
}