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

时间:2018-07-10 04:12:31

标签: swift xcode macos cocoa swift4

前一段时间我在Swift 2中进行了一些Swift编程,现在正尝试使用Swift4。也许我错过了一些显而易见的东西,但是我一生中都无法获得一个非常简单的基于文档的文本编辑器应用程序以正确打开或保存文件。我制作了基于文档的应用程序,并将此代码添加到ViewController类中:

@IBOutlet var theTextView: NSTextView!

然后我转到情节提要,向其中添加一个Text View,然后将该Text View作为插座连接到TextView。我向Document添加了数据并读取了函数,如下所示:

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添加到视图控制器,而没有添加插座或代码,我也会得到完全相同的行为。显然,可可并没有意识到我的代码和/或销售渠道是相关的,但是我无法终生弄清楚为什么。我想念什么?

1 个答案:

答案 0 :(得分:0)

如vadian所建议的那样,摆脱上面的“抛出”问题解决了read方法。

数据方法需要两个修复程序。首先,显然没有人告诉您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)
}

然后成功保存的