基于 NSDocument 的应用程序:在 NSSavePanel 中选择默认文件类型

Posted

技术标签:

【中文标题】基于 NSDocument 的应用程序:在 NSSavePanel 中选择默认文件类型【英文标题】:NSDocument-Based Application: Selecting Default File Type in NSSavePanel 【发布时间】:2021-11-07 09:42:48 【问题描述】:

我正在使用NSDocument 类来制作一个简单的基于文档的应用程序。我的 info.plist 包含四个文档内容类型标识符,包括 public.text、public.plain-text、public.source-cde、public.rtf,如上所示。如果我调用保存面板 (NSSavePanel),我会列出这些文件类型,如下所示。

我的问题是是否可以以编程方式选择其中一种文件类型。当保存面板出现时,我可以选择“富文本 (RTF)”吗?

以下是我的文档 (NSDocument) 文件的一部分。

import Cocoa

class Document: NSDocument 
    override init() 
        super.init()
    

    override class var autosavesInPlace: Bool 
        return false
    
    
    override func save(withDelegate delegate: Any?, didSave didSaveSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) 
        if let _ = fileURL 
            Swift.print("Saved!!!")
         else 
            Swift.print("Not saved yet...")
            NSApp.sendAction(#selector(NSDocument.saveAs(_:)), to: nil, from: self)
        
    
    
    override func writableTypes(for saveOperation: NSDocument.SaveOperationType) -> [String] 
        return super.writableTypes(for: saveOperation)
    
    
    override func prepareSavePanel(_ savePanel: NSSavePanel) -> Bool 
        savePanel.allowsOtherFileTypes = true
        savePanel.isExtensionHidden = false
        
        guard let accessoryView = savePanel.accessoryView else  return true 
        for sub in accessoryView.subviews 
            Swift.print("Class: \(sub.className)")
            /*
            if sub.isKind(of: NSPopUpButton.self) 
                if let popUpButton = sub as? NSPopUpButton 
                    popUpButton.selectItem(at: 5)
                    Swift.print("Sure")
                
            
            */
            
        
        return true
    

我看到this topic 是一个类似的标题,他使用IKSaveOptions,根据文档,它用于“保存图像数据”。我的应用程序处理文本。

谢谢。

【问题讨论】:

您要选择新文档的文件类型还是要更改现有文档的文件类型? @Willeke 谢谢你的提问。我只需要从文件下拉菜单中选择第三个。但如果有什么不同,我说我想为新文档选择一个特定的。 你试过设置fileType吗? @Willeke 将文件类型设置为什么?无论如何,我怀疑我已经做到了。 @ElTomato 您是否尝试在文件名中添加扩展名? 【参考方案1】:

默认文件格式为fileType。在writableTypes(for:)runModalSavePanel(for:delegate:didSave:contextInfo:) 中设置fileType

override func writableTypes(for saveOperation: NSDocument.SaveOperationType) -> [String] 
    fileType = "public.rtf"
    return super.writableTypes(for: saveOperation)

【讨论】:

谢谢。哇...在writableTypes(for:) 下?谁会弄清楚呢?如果你能告诉我,你怎么知道的?是因为你有多年使用NSDocument 的经验吗? 是的,多年的 Cocoa 经验。我查看了 TextEdit 示例代码并进行了一些调试。 我想我已经做过一次了。好的。再次感谢。

以上是关于基于 NSDocument 的应用程序:在 NSSavePanel 中选择默认文件类型的主要内容,如果未能解决你的问题,请参考以下文章

OS X Cocoa:基于 NSDocument 的应用程序未保存

NSDocument 应用程序和文件扩展名

NSDocument 唯一标识符

在没有任何窗口的情况下保持和 NSDocument 打开

自动保存非来自用户的 NSDocument 模型更改

如何同时保存 NSDocument?