NSDocument никогда не сохраняет документ - PullRequest
0 голосов
/ 18 февраля 2020

Жизнь была довольно простой, когда я впервые протестировал разработку текстового приложения с NSDocument. Теперь у меня есть намного более сложное настольное приложение на основе документов с несколькими пользовательскими моделями, кроме строки с NSTextView. Мой подкласс NSDocument выглядит следующим образом.

import Cocoa

class Document: NSDocument {
    // MARK: - Variables
    var image = NSImage()
    var myPasteModels = [PasteModel]()
    var myPanModel: PanModel?
    var myWinModel: WindowModel?


    // MARK: - Initialization
    override init() {
        super.init()
    }


    // MARK: - Auto saving
    override class var autosavesInPlace: Bool {
        return false
    }

    override func data(ofType typeName: String) throws -> Data {
        if let viewController = windowControllers[0].contentViewController as? MainViewController {
            if viewController.imageModels.count > 0 {
                viewController.saveSubViewPositions()
                if let window = viewController.view.window {
                    var pasteModels = [PasteModel]()
                    for i in 0..<viewController.imageModels.count {
                        let imageModel = viewController.imageModels[i]
                        ...
                        ...
                    }

                    NSKeyedArchiver.setClassName("ColorModel", for: ColorModel.self)
                    NSKeyedArchiver.setClassName("TextModel", for: TextModel.self)
                    NSKeyedArchiver.setClassName("ShapeModel", for: ShapeModel.self)
                    NSKeyedArchiver.setClassName("ShadeModel", for: ShadeModel.self)
                    NSKeyedArchiver.setClassName("LineModel", for: LineModel.self)
                    NSKeyedArchiver.setClassName("GradientModel", for: GradientModel.self)
                    NSKeyedArchiver.setClassName("ArrowModel", for: ArrowModel.self)
                    NSKeyedArchiver.setClassName("PasteModel", for: PasteModel.self)
                    NSKeyedArchiver.setClassName("PanModel", for: PanModel.self)
                    NSKeyedArchiver.setClassName("WindowModel", for: WindowModel.self)
                    let panModel = PanModel(frameWidth: viewController.panView.frame.size.width, frameHeight: viewController.panView.frame.size.height)
                    let winModel = WindowModel(width: window.frame.width, height: window.frame.height)
                    let dict = ["PasteModel": pasteModels, "PanModel": panModel, "WindowModel": winModel] as [String : Any]
                    do {
                        let modelData = try NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false)

                        return modelData
                    } catch let error as NSError {
                        Swift.print("\(error)")
                    }
                }
            }
        }
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }

    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 prepareSavePanel(_ savePanel: NSSavePanel) -> Bool {
        savePanel.allowedFileTypes = ["fss"]
        savePanel.allowsOtherFileTypes = true
        savePanel.isExtensionHidden = false
        return true
    }
}

Проблема, с которой я столкнулся, заключается в том, что приложение никогда не сохраняет документ, если я выберу «Сохранить как» в меню «Файл» (или нажмите клавиши «Command» + «Shift» + «S»). Если я выберу Сохранить как, приложение подаст звуковой сигнал и отклонит выбор команды. Он вводит метод prepareSavePanel, если я устанавливаю точку останова там. Так что же я могу сделать для go дальше? Спасибо.

...