プロジェクトを開始する

プロジェクトを作るには、ターミナル.app でプロジェクトフォルダを作りたいディレクトリに移動し、次のコマンドを入力。

$ motion create <プロジェクト(アプリケーション)名> --template=osx

これで、プロジェクトフォルダができて、その中に必要なファイルがコピーされる。

この他にも、ここ (GitHub) から、Document-based Application や、nib ファイル伴う(Cocoa Application のような)テンプレートがダウンロードできる。

$ motion create <プロジェクト(アプリケーション)名> --template=osx-doc-based

$ motion create <プロジェクト(アプリケーション)名> --template=osx-with-nib

ib を使う場合は、最初からこのどちらかを使った方が楽。

標準テンプレートを使った場合は、プロジェクトファイルができたら、プロジェクトフォルダに移動して、

$ rake

で、コンパイルして実行する。

標準では、すべてスクリプトで処理していくことになるので、UI もすべてスクリプトで書いていくことになる。いろいろと便利なラッパーも用意されているようだが、Xcode の Interface Builder を使いたいので、ib という Interface Builder をサポートするラッパーを使う。詳しくは、Git Hub のページを参照してください。

また、

まずは、インストール。今後も楽をしたいので、まずは、bundler という、application dependency を管理する gem を使うと便利そうなので、使ってみた。Bundler がインストールされていない場合は、まず、

$ sudo gem install bundler

として、bundler をインストール。そしたら、プロジェクトフォルダ内にある Gemfile に

gem 'ib'

という一行を加えて、ターミナル.app に戻り、プロジェクトフォルダ内に移動して、

$ bundle

を実行する。

上記の、標準以外のテンプレートを使った場合は、IB と CocoaPods を使うことが前提となっているので、gem 'ib' は既に Gemfile に書いてある。また、bundle を実行すると、motion-cocoapods があるため、追加で gem のインストールを促されるので、それぞれ sudo を付けてインストールする。

また、CocoaPods の依存関係がないと出てくるので、

rake pod:install

を実行する。これで初めて rake できるようになる。

次に、スクリプトのクラス内で、

extend IB

と入力し、IBOutlet を指定していく。outlet は Interface Builder 上で管理したいパーツに付けるラベルみたいなものと考えたらいい。MacRuby では、attr_accessor で outlet にしたいものを指定しただけだが、ここでは、outlet で、ラベルとクラスの指定をする。もしかしたら、クラスは指定する必要はないのかもしれない。指定すると、指定したクラスのオブジェクトとしか接続できなくなる。id での指定もできるように書いてあるが、わからないので試していない。

outlet :startBtn, NSButton

IBAction は、MacRuby と同様に、

def beginProcess(sender)

ここに処理を書く。

end

と、メソッド定義で、引数を sender にする。

これで、ターミナル.app に戻って、

$ rake ib:open

を実行する。(これは、スクリプト側で outlet もしくは action を追加・変更するたびに実行する。)

これで、プロジェクトフォルダ内に、ib.xcodeproj というファイルができて、Xcode で開く(ファイルをダブルクリックしても開く)。

開いたら、Xcode で Resources フォルダに必要なタイプの xib ファイルを追加する(MacRuby のプロジェクトを移植する場合など、すでに xib ファイルがあれば、リソースフォルダにコピーすると認識される)。追加したら、xib ファイルを開いて、File's Owner を選択し、Identity Inspector(右側コラムの一番上の左から 3 番目のアイコン)を選んで、Custom Class で、接続したい outlets や actions を指定したクラスを選ぶ。これで、File's Owner を右クリックすると、それらが現れるので、UI パーツと結びつける。終わったら保存して、ターミナル.app で rake を実行する。

今のところ、メニューを IB でどうにかする方法はわからない。AppDelegate 自体も、どう処理していいかよくわからない。つながるときもあるので、もう少しゆっくり見てみる必要があるか。

例えば、ウィンドウ一つのアプリケーションを作る場合、テンプレートの app_delegate.rb の最初は、

def applicationDidFinishLaunching(notification)

buildMenu

buildWindow

end

となっていて、buildWindow は同一ファイル内で定義し、buildMenu は別ファイルで定義している。デフォルトでは、buildWindow でスクリプトでウィンドウを描いているが、これを IB で扱いたいので、 Xcode 上で、Resources フォルダを二本指クリックして New File... で左の User Interface を選んで、Window を選び、MainWindow.xib を作る。

そして、app_delegate.rb に戻って、次のように書く。

def buildWindow

@mainWindowController = MainWindowController.alloc.initWithWindowNibName('MainWindow')

@mainWindowController.window.makeKeyAndOrderFront(self)

end

プロジェクトフォルダの app フォルダに、main_window.rb(ファイル名は任意)というファイルを作り、

class MainWindowController < NSWindowController

extend IB

outlet :text, NSTextField

outlet :startBtn, NSButton

def startProcess(sender)

@text.setStringValue("Start!")

end

end

というような感じで、スクリプトを書く。スクリプトを書いたら、上に書いたように、rake ib:open を実行する。

また、Xcode に戻って MainWindow.xib を開き、NSWindow のパーツを配置し、その上に、Label (NSTextField) と適当な Button (NSButton) を配置し、File's Owner を二本指クリックして、それぞれの Outlet と Action をパーツと結びつける。

最後に、アプリケーションの名前と、ビルドターゲットを指定する。Rake ファイルを開くと、app.name でアプリケーションの名前が指定してある。デフォルトでは、プロジェクト名が入っている。ビルドターゲットは、開発環境の OS のバージョンになるようなので、それより前のバージョンの OS X でも動作させたいときは、app.deploy_target で指定する。

app.name = 'Application Name'

app.deployment_target = "10.7"

QTKit, WebKit, PDFKit (Quartz) などのフレームワークを読み込む必要があるときも app.frameworks に追加する。

app.frameworks << 'QTKit'

app.frameworks << 'WebKit'

app.frameworks << 'Quartz'

あと、確認していないが、Xcode の Interface Builder 上でも、OS のバージョンを指定する必要があるかもしれない。xib ファイルを選んで、右側のインスペクタの一番左の File Inspector を選び、Interface Builder Document の Builds for で、サポートしたいバージョンを指定する。10.7 の場合は、OS X 10.7 and Later を選ぶ。