##誰に読んで欲しいか?
今回は、macOSアプリケーションの話です。Document Based Application。アプリケーションからファイルを作成、保存し、ファイルを開いて編集する。いかにもパーソナルコンピュータらしいアプリケーションですが、これをXcodeのDocument Based Applicationのテンプレートから作ろうとすると、なにがなにやらようわからんと、戸惑う経験をした人は、私だけではないでしょう。そこで、とりあえずテンプレートからじっさいに動くアプリケーションを作って、最初のハードルを越えられるようにしようという内容です。
##なにを作るか?
シンプルテキスト(プレーンテキスト)を編集し、保存するアプリケーションです。
##Xcodeを起動しよう。(ここから10分間です)
Use Storyboardにチェック入れず(Storyboardは使わない)、Create Document-Based Applicationにチェックを入れます。シンプルテキストが目的なので、Document Extensionをtxtにします。
Text Viewをウインドウにドラッグして、貼り付けます。File's Owner(Documentクラス)に、Text Viewをコネクトして、textViewというインスタンス名をつけます。
- コード編集は、Document.swiftに対してだけ行います。以下、
// ↓↓↓↓
から、// ↑↑↑↑
の間のコードが、テンプレートに追加したコードです。
import Cocoa
class Document: NSDocument {
// ↓↓↓↓
@IBOutlet var textView: NSTextView!
var documentText: String?
// ↑↑↑↑
override init() {
super.init()
}
override class func autosavesInPlace() -> Bool {
return true
}
override var windowNibName: String? {
return "Document"
}
// ↓↓↓↓
override func windowControllerDidLoadNib(_ windowController: NSWindowController) {
super.windowControllerDidLoadNib(windowController)
if let text = documentText {
textView.string = text
}
}
// ↑↑↑↑
override func data(ofType typeName: String) throws -> Data {
// ↓↓↓↓
if let data = textView.string?.data(using: .utf8) {
return data
}
// ↑↑↑↑
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}
override func read(from data: Data, ofType typeName: String) throws {
// ↓↓↓↓
if let text = String(data: data, encoding: .utf8) {
documentText = text
return
}
// ↑↑↑↑
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
}
}
以上です。ビルドしてください。
コードの解説は、あえてしないでおこうと思います。追加したコード1行1行が、なにを意図しているのか、みなさんで読み解いていくのが、いい学習になるのではないでしょうか。
次回は、同じ内容を、Storyboardを使ったプロジェクトで書いたらどうなるかを、検討してみたいと思います。