はじめての Cocoa Application

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

さて、私が今まで Xcode を開いて、新規プロジェクトを作成する際、大抵真っ先に選ぶのは、iOS の項目の中にあるテンプレートです。

スクリーンショット 2016-07-06 22.43.19

例えば、こんなふうに。

貼り付けた画像_2016_07_06_23_42

しかし、そこを変えて、今回は OS X の項目を選んでみます。

というわけで、普段 iOS アプリを作成している私が、OS XCocoa Application テンプレートを使ってみた、というのが今回のお話になります。

Storyboard

iOS で 例えば Single View Application を選択すると、UIViewControllerが1つ Storyboard 上に置かれている、という状態になります。

貼り付けた画像_2016_07_06_23_45

しかし、OS XCocoa Application を選択すると、見た目上、なにやら3つ表示されています。一番上にはメニューバーが見えますね。

この状態で実行してみましょう。

スクリーンショット_2016-07-06_23_47_11

Storyboard上のメニューバーが、画面最上部に現れました。

Cocoa Application のメニューバーはStoryboard上で扱えるようですね。

文字を表示する

iOS アプリであれば、UILabelを使えますね。

@IBOutlet weak var label: UILabel!
label.text = "Hello World"

例えばこうです。アウトレットで繋いだUILabel型のlabelで表示するテキストを、コード中から指定する想定のコードです。

しかし、Cocoa Application では、UIを接頭辞とするクラスは使いません。UILabelは使いません。

スクリーンショット 2016-07-06 23.50.57

オブジェクトライブラリで、Labelを検索すると、すぐ見つかります。2つのうち上の方の"Label"を、View Controller に貼り付けて、コードとアウトレットで結びます。

スクリーンショット 2016-07-06 22.23.15

オブジェクトライブラリ上でLabelと表示されていたものが、実際はNSTextField型のオブジェクトであることがわかります。

NSLabel というものは無いんですね。。

テキスト内容の変更

@IBOutlet weak var textField: NSTextField!
self.textField.text = "Hello World"

これだとエラーが出ます。

NSTextFieldtextプロパティを持っていないからです。

内容を変更するには、stringValueプロパティを用います。

self.textField.stringValue = "Hello macOS World"

スクリーンショット 2016-07-06 23.55.05

これでOKですね。

画像を表示する

続いて画像です。こちらは iOS と同じ感覚で行けるでしょうか?

スクリーンショット 2016-07-06 22.35.04

オブジェクトライブラリで探すと、Image Viewが見つかります。こちらを View Controller に貼り付け、大きさや位置を整えます。

@IBOutlet weak var imageView: NSImageView!

アウトレットでコードとつなぎます。NSImageView型だという事がわかりますね。

コード中から画像を半透明にしたいと思います。

self.imageView.alpha = 0.5

iOS ならこうですね。UIImageView型のimageViewのアルファ値を下げています。

しかし、NSImageViewには、alphaプロパティがありません。

self.imageView.alphaValue = 0.5

代わりにCGFloat型のalphaValueを使います。

実行する

スクリーンショット 2016-07-06 22.41.08

実行してみました。

とても単純なアプリですが、Macアプリがうごきました。

まとめ

Cocoa Application を作るために必要なクラスは、iOS のそれと似ている一方、別物でもあります。

似た機能を持つクラスのプロパティ名も、細かいところで違ったりします。

しかし、同じ Xcode という環境で開発がデキるため、少なくとも取っ掛かり部分に関しては、そこまで難しいものではないと思いました。