Help us understand the problem. What is going on with this article?

Swiftを使ったMac OS Xアプリの開発【Data Road編】

More than 1 year has passed since last update.

Swiftに関する日本語の情報もかなり増えてきているように感じますが、殆どがiOSアプリ開発に関するものです。そこで、趣味でMac OS Xアプリ開発を行いましたので、数回に分けて記事にしていこうと思います。
ちなみに、Macの利用比率が世界的に低いため、利益などを考慮する場合は、WebアプリやJavaアプリとして開発したほうがいいかもしれません。また、Swiftで開発を行うと、昔のMac OSで対応できないものが出てくるようです。

前提条件

iOSアプリの開発歴があるものとして解説を行いますので、共通な作業は省略している箇所があります。また、アプリに実装する機能などによっては、追加で必要なことや、今回の作業に不要なことが含まれている可能性があります。

開発環境

Mac OS X 10.11.6
Xcode 7.3.1

完成作品

完成作品

アプリに読み込ませたいリソース(今回はPNG)がある場所を指定して読み込ませるというものです。指定した名前のファイルが見つからなかった場合はエラー表示をします。
ソースをGitHubに置いていますので、よければご利用ください。

1.ディレクトリの指定

完成作品

レイアウトはこのように作成しました。Storyboardの使い方に関しても記事にしていますので、参考にしてみてください。
Read Buttonは Action としてリンクさせ、以下のように記述します。

ViewController.swift

@IBAction func savePush(sender: AnyObject) {
    // ファイルを開く・ファイルを開く場合はNSOpenPanelを使用
    let panel = NSOpenPanel()
    // ファイル選択を許可させるか
    panel.canChooseFiles = false
    // ディレクトリ選択を許可させるか
    panel.canChooseDirectories = true
    // 複数選択を許可させるか
    panel.allowsMultipleSelection = false

    panel.beginWithCompletionHandler({ (num) -> Void in
        if num == NSModalResponseOK {

            // パスを渡す
            self.readItem((panel.directoryURL?.path)! + "/sample.png")
        }
    })
}

ポイントとしては、非同期処理部分でしょうか。実行するとわかりますが、ディレクトリ選択Windowが表示されるまで多少時間がかかります。
なので、パスを渡す処理を非同期処理内で記述しないとnilで怒られます。

2.画像データの取得

先ほどパスを渡した先を記述していきます。  

@IBOutlet weak var outPutImage: NSImageView!
private let alert = NSAlert()

func readItem(url: String) {
    // 画像データが存在するか
    if (NSImage(contentsOfFile: url) != nil) {
        let image: NSImage = NSImage(contentsOfFile: url)!
        // 画像をセット
        outPutImage.image = image
    } else {
        // エラーダイアログ
        alert.messageText = "Error"
        alert.informativeText = "Not find sample.png"
        alert.runModal()
    }
}

Storyboardに設置したNSImageViewから Outlet としてリンクさせます。readItemメソッドでは、初めに画像データが存在するかを確かめてから、NSImageViewに反映させています。
また、存在しない場合はエラーダイアログを表示しています。実際のアプリに導入する場合は「No Image」などの初期画像を反映させるようにするといいと思います。
もっとカッコいい方法があるような気がしますが、これでもクラッシュするようなことはないと思います。

3.なぜアプリ側がデータを保管しないのか

実はこの方法、私がやりたかった方法とちょっと違うんです。
ユーザに画像などを選択させ、そのファイルをアプリの管理下にコピーして利用したかったんです。
NSUserDefaultsで保存するという方法もありますが、mp4ファイルも保存させたいこともあり、明らかに無理そうだったので採用しませんでした。あと、NSUserDefaultsで保存させるとappファイル外で管理させるため、保管場所として不適切な気もします。

4.宣伝

初めて作成したOS Xアプリです!

KeiSignal
プロ生ちゃんが時間を知らせてくれるMac専用の時報アプリケーションです。
ミュート機能など、複数の設定が可能。
課金・広告などは一切ございません。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした