代码之家  ›  专栏  ›  技术社区  ›  Displaced Hoser

打开和保存在非常简单的基于swift 4文档的应用程序中不起作用

  •  0
  • Displaced Hoser  · 技术社区  · 6 年前

    不久前我在Swift2中做了一些Swift4编程,现在正在尝试使用Swift4。也许我遗漏了一些非常明显的东西,但是我不能让一个非常简单的基于文档的文本编辑器应用程序正确地打开或保存文件。我创建了基于文档的应用程序,并将此代码添加到ViewController类中:

    @IBOutlet var theTextView: NSTextView!
    

    然后我去故事板,添加一个文本视图到它,并连接到文本视图作为一个出口。我在文档中添加了以下数据和读取功能:

    override func data(ofType typeName: String) throws -> Data {
    
        if let vc = self.windowControllers[0].contentViewController as? ViewController {
            return vc.theTextView.string.data(using: String.Encoding.utf8) ?? Data()
        }
        else {
            return Data()
        }
    
    }
    
    override func read(from data: Data, ofType typeName: String) throws {
    
        if let s = String(data: data, encoding: String.Encoding.utf8) {
            string = s
        }
    
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
    

    程序编译并运行。但是每当我尝试保存时,不会出现保存对话框,应用程序将无法退出(我必须在Xcode中停止它)。每当我试图以我为应用程序设置的格式打开一个文件时(即使它只是.txt),我会得到错误“无法打开文档[文件名]”。即使我所做的只是将textview添加到视图控制器,而不添加出口或代码,我也会得到完全相同的行为。很明显,Cocoa并没有意识到我的代码和/或出口是相关的,但我无法在我的一生中找出原因。我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Displaced Hoser    6 年前

    正如瓦迪安所建议的那样,去掉上面的“throw”修正了读取方法。

    数据方法需要两个修正。首先,显然没人告诉你 you now need to set permissions 能够写一个文件。我必须这样做,遵循链接上的说明。

    第二,我想我需要放弃“自我”当得到视图控制器?我不完全确定为什么这会起作用,但我更多地使用代码,并将其更改为

    var viewController: ViewController? {
        return windowControllers[0].contentViewController as? ViewController
    }
    
    override func data(ofType typeName: String) throws -> Data {
        let textView = viewController?.theTextView
        if let contents = textView?.string.data(using: String.Encoding.utf8)
        {
            return contents
        }
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }
    

    那个 成功保存。