Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用单个窗口的基于文档的应用程序_Swift_Macos_Nsdocument_Document Based_Nsdocumentcontroller - Fatal编程技术网

Swift 使用单个窗口的基于文档的应用程序

Swift 使用单个窗口的基于文档的应用程序,swift,macos,nsdocument,document-based,nsdocumentcontroller,Swift,Macos,Nsdocument,Document Based,Nsdocumentcontroller,我有一个基于文档的macOS应用程序,它是一个基本的文本编辑器。默认行为是为每个打开的文档创建一个新窗口。但我希望一次只显示一个窗口,在打开文档或创建新文档时,这应该发生在同一个窗口中,从而替换旧文档 我试着在NSDocument中的makeWindowController方法中进行一些黑客攻击,方法是不实例化新的窗口控制器,而是重用旧的窗口控制器。但在这种方法出现一些问题后,我认为这不是正确的方法。我想知道是否有一个共同的方法来解决这个问题 这是我试过的代码 class Document: N

我有一个基于文档的macOS应用程序,它是一个基本的文本编辑器。默认行为是为每个打开的文档创建一个新窗口。但我希望一次只显示一个窗口,在打开文档或创建新文档时,这应该发生在同一个窗口中,从而替换旧文档

我试着在
NSDocument
中的
makeWindowController
方法中进行一些黑客攻击,方法是不实例化新的窗口控制器,而是重用旧的窗口控制器。但在这种方法出现一些问题后,我认为这不是正确的方法。我想知道是否有一个共同的方法来解决这个问题

这是我试过的代码

class Document: NSDocument {
    
    static var sharedWindow: NSWindowController?
    
    override func makeWindowControllers() {
        // Instaniate window controller there is none
        if Document.sharedWindow == nil {
            // Returns the Storyboard that contains your Document window.
            let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
            Document.sharedWindow = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("Document Window Controller")) as? NSWindowController
        }

        guard let sharedWindow = Document.sharedWindow else { return }
        if let previousDocument = sharedWindow.document as? NSDocument {
            previousDocument.close()
        }

        self.addWindowController(sharedWindow)

        sharedWindow.contentViewController?.representedObject = content
        (sharedWindow.contentViewController as? ViewController)?.handleOpenDocumentOperation()
    }

    ...
}

谢谢,我已经尝试过这个解决方案并更新了我的问题。问题是,现在当新文档(尚未保存)发生更改时,有关这些未保存更改的警告表不会出现。相反,新窗口只是显示出来。同样的,已经保存的文件有未保存的更改。警报表不显示,自动保存也不起作用。当我添加
previousDocument.save(self)
时,保存的文件将被保存。对于未保存的文件,将显示警报表,但新窗口会立即取消警报。