LoginSignup
20

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-27

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専用の時報アプリケーションです。
ミュート機能など、複数の設定が可能。
課金・広告などは一切ございません。

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
20