LoginSignup
14
17

More than 5 years have passed since last update.

[macOS] 超速!10分間で、テキストエディタを作る。Swift3編

Posted at

誰に読んで欲しいか?

今回は、macOSアプリケーションの話です。Document Based Application。アプリケーションからファイルを作成、保存し、ファイルを開いて編集する。いかにもパーソナルコンピュータらしいアプリケーションですが、これをXcodeのDocument Based Applicationのテンプレートから作ろうとすると、なにがなにやらようわからんと、戸惑う経験をした人は、私だけではないでしょう。そこで、とりあえずテンプレートからじっさいに動くアプリケーションを作って、最初のハードルを越えられるようにしようという内容です。

なにを作るか?

シンプルテキスト(プレーンテキスト)を編集し、保存するアプリケーションです。

Xcodeを起動しよう。(ここから10分間です)

  • 新規プロジェクトを作成します。 create1.png

macOSのCocoa Applicationを選びます。
create2.png

Use Storyboardにチェック入れず(Storyboardは使わない)、Create Document-Based Applicationにチェックを入れます。シンプルテキストが目的なので、Document Extensionをtxtにします。

  • Document.xibを選択します。 xibFile.png

Text Viewをウインドウにドラッグして、貼り付けます。File's Owner(Documentクラス)に、Text Viewをコネクトして、textViewというインスタンス名をつけます。

  • コード編集は、Document.swiftに対してだけ行います。以下、// ↓↓↓↓から、// ↑↑↑↑の間のコードが、テンプレートに追加したコードです。
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を使ったプロジェクトで書いたらどうなるかを、検討してみたいと思います。

14
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
17