我很抱歉,如果这个论点已被涵盖,但经过一些研究后我发现没有什么精确的.
我需要创建一个基于文档的应用程序,其中文档实际上不是单个文件,而是目录中的文件的结构化集合.窗口将显示包含在文件夹中的pdf,具有特定的文件名,并使用文件夹中其他文件的信息进行丰富.我无法使用pdf注释来实现这一点,我真的需要将文件与pdf分开.
实现这一目标的最佳方法是什么?我找到的所有示例代码都使用单个文件..
我正在制作一个基于文档的Cocoa应用程序,其中文档是动态的文件集合(用户可以添加或删除文件).特别是,保存和打开操作应该尽可能快.
如果我正确理解文档,我应该使用NSFileWrapper并实现fileWrapperOfType:error和readFromFileWrapper:ofType:error:.但是,我找不到完整的代码示例.我该如何实现以下方法?
#pragma mark - NSDocument
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError {
return nil;
}
- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError **)outError {
return YES;
}
#pragma mark - My methods
- (void) addFileToDocumentFromURL:(NSURL*)fileURL {
// Add a file to the document given the file URL
}
- (void) removeFileFromDocumentWithName:(NSString*)name {
// Remove a file from the document given the file name
}
Run Code Online (Sandbox Code Playgroud) 我有一个基于文档的应用程序,我已经分类NSDocument并提供了所需的方法,但我的文档需要一些广泛的清理(需要运行外部任务等).把它放在哪里最好的地方?我尝试过几种不同的方法,例如:
closeclose:canCloseDocumentWithDelegate:shouldCloseSelector:contextInfodealloc如果我把它放入dealloc,有时它会被调用,有时它不会被调用(按下Command + Q似乎绕过我的文件的释放),但是必须在没有失败的情况下调用此代码(除非程序意外终止).
我想通过选项卡式界面编写一个可能在一个窗口中有多个文档的应用程序.我应该避免使用NSDocument架构(基于Cocoa文档的应用程序模板)吗?据我所知,它每个文档只支持一个或多个窗口,反之则不然.
我已经和这个问题争论了一段时间,并且已经在NSDocument架构上构建了我的大部分应用程序但是我无法想出一个将多个文档与单个窗口相关联的好方法.
编辑:除了基本的文档窗口,我想要项目文档窗口.在这种复杂程度上,还是值得攻击NSDocument架构吗?Apple是否使用NSDocument架构编写Xcode(以这种方式工作)?
我有一个基于NSDocument的应用程序启用了自动保存.
我想阻止这个弹出窗口显示: 
我试过从NSWindow的-title,-representedFilename和-representedURL返回nil,隐藏标题有效地隐藏了标题,但对向下的披露指标和弹出窗口没有影响.
有没有办法阻止弹出这个弹出窗口?
我正在设计一个自定义应用程序,我为我的文件类型设置了一个自定义图标.
我已将图标放在文档类型和导出的UTI部分(显然也填写了其他值).
这是我跑步时得到的:

Finder中未定义任何图标

但在快速查看中,它显示正确.
我已经看到CFBundleTypeIconFile Icon没有显示给定的文件扩展名并尝试重建启动服务数据库.我重新启动了Finder,清理了Xcode项目/派生数据等并重新运行,但没有任何改变.Finder仍然不显示我的图标.我的ICNS文件包含所有必需的大小.一切正常,否则(当我双击它时,我的应用程序等正确打开).顺便说一句,我的文件有扩展名,它只是不在Finder中显示.我可以通过ls终端验证它是否具有正确的扩展名.
如何让Finder显示我的图标?
目前我的应用程序界面上有一个按钮,允许打开文件,这是我的开放代码:
在我的app.h中:
- (IBAction)selectFile:(id)sender;
Run Code Online (Sandbox Code Playgroud)
在我的app.m中:
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
}
- (IBAction)selectFile:(id)sender {
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
NSArray *fileTypes = [NSArray arrayWithObjects:@"xml",nil];
NSInteger result = [openPanel runModalForDirectory:NSHomeDirectory() file:nil types:fileTypes ];
if(result == NSOKButton){
NSString * input = [openPanel filename];
Run Code Online (Sandbox Code Playgroud)
如何编辑我的代码以允许打开应用程序图标拖放?
注意:我编辑了.plist文件并为"xml"添加了一行,但它改变了任何内容,当我的文件被放在图标上时出现错误.
注2:我将"文件 - >打开..."链接到selectFile:参考我的代码
注3:我的应用程序不是基于文档的应用程序
谢谢你的帮助!
Miskia
如何防止窗口标题显示为"脏"的NSDocument的"已编辑"?
我正在使用网络服务管理自己的保存和自动保存,只是不想在标题栏中分心.
我试过压倒:
-isDocumentEdited并-hasUnautosavedChanges始终返回NO.-[NSWindowController setDocumentEdited]什么都不做,或总是使用NO不管参数的实际值.-[NSWindowController synchronizeWindowTitleWithDocumentName] 什么都不做-[NSWindow setDocumentEdited]什么都不做,或总是使用NO不管参数的实际值.在所有情况下,当我对保存的文档进行更改时,标题栏仍会更改为"已编辑".
如果我覆盖-[NSDocument updateChangeCount:]并且-[NSDocument updateChangeCountWithToken:forSaveOperation:]什么都不做,我可以防止这种情况发生,但它也会影响保存,自动保存和其他文档行为.
我也试过这个:
[[self.window standardWindowButton: NSWindowDocumentVersionsButton] setTitle:nil];
Run Code Online (Sandbox Code Playgroud)
这显示一个空白字符串而不是编辑,但破折号仍然出现 - 通常分隔文档名称和编辑.
知道如何从文档中撬开这部分窗口吗?
苹果文档建议重写一个NSDocument便利的init(initWithType:描述错误:) 这里.
但是,由于这是一个方便的初始化,我无法覆盖它.但是我仍然需要在创建新文档时执行一些代码.我加载文档时不想执行该代码.
在我的特定情况下,我尝试初始化NSPersistentDocument,但我怀疑这是否相关.
我该怎么办?
有时在使用我的基于文档的 mac 应用程序(Xcode 10、Swift 4.2、macOS 10.13.5)时,我在控制台中收到以下错误:
_NSDocumentBasicAsyncOperation 0x60c000233c40 isFinished=YES 没有被它所在的队列启动
我理解当您使用异步操作时会发生这种情况(参见,例如,this question),但我不知道。这是 Cocoa 自己完成的事情,所以我的问题是我应该有多担心,我怎样才能找出这个错误的来源?我覆盖了 NSDocumentController 和 NSDocument 中的一些函数;我怀疑它是 NSDocument 中的东西(我在每个打开的文档中都会得到其中一个),但是我很困惑从哪里开始进行故障排除,并且对可能发生的事情感到好奇。
nsdocument ×10
cocoa ×7
macos ×3
nswindow ×2
objective-c ×2
swift ×2
directory ×1
osx-lion ×1
osx-yosemite ×1
xcode ×1
xcode6 ×1