Learn AppleScriptObjC
プロジェクトの作成 難しい話は後回しにして、さっそくアプリを作ってみましょう。作るのは、Fortune という今日のラッキッキナンバーとラッキーカラーを占うアプリです。次の手順に従って Fortuneプロジェクト作ってください。なお私は、この改訂版から Mac OS X 10.10 と Xcode 6.0.1 を使っています。
- File > New > Project... を選んでテンプレート・ウィンドウを表示
- OS X カテゴリーの Application か Other の中から Cocoa-AppleScript テンプレートを選び Next ボタンをクリック
- 次の画面で Product Name に Fortune、Organization Name にあなたの名前、Organization Identifier に あなたの所属している会社などの URL を逆に並べたもの、なければ com.yourcompany、そして Create Documnet-Based Application のチェックをはずし Next をクリック
- 次の画面で Source Control のチェックを外し、任意の保存場所を選んで Create をクリック
- プロジェクトが立ち上がったら左ペインのファイルリストから MainMenu.xib を選択(フォルダを開かなければ見つからないかもしれません)
- 続けて右ペインで一番左の Show the File Inspector を選び、Use Auto Layout 項目を探してチェックをはずす(この作業はとても重要です)
ここまで出来ましたら、プロジェクトウィンドウの一番左上にある右向き三角をクリックして Fortune を起動させてみましょう。何もないウィンドウが表示されれば OK です。Fortune > Quit Fortune を選んで終了させてください。
コントローラ 通常、Mac のプログラミングでは、GUI を作れるだけ作り込んでからソースコードに取りかかります。しかしここでは説明の都合上、まずはソースコードファイルを作ります。コントローラとは MVC (Model-View-Controller) の Controller のことで View と Model の中継ぎをするものです。そして View は GUI、Model はデータそのもののことになります。では、次の手順に従ってソースコードファイルを作ってください。
- プロジェクトウィンドウの左ペインのどこかを右クリックし(左ペインならどこでも構いません)New File.. を選択
- 次の画面で OS X カテゴリーから白い Empty テンプレートを選択し(青い Empty ではないので注意してください)Next をクリック
- 次の画面で Save As を Controller.applescript にして Create をクリック
- 左ペインに出来上がった Controller.applescript をドラッグして、AppDelegate.applescript と揃える(この作業はたんに見た目だけの問題です)
次に Controller.applescript を選択して次のようにコーディングしてください。
script Controller property parent : class "NSObject" property textField : missing value on fortune_(object) end fortune_ end script簡単にコードの説明をすると次のようになります。なお、コードについては次節以降でゆっくりと説明いたします。
- script Controller 〜 end script
- この二行に囲まれたコードがクラスと呼ばれるプログラミングの部品になります。
- property parent : class "NSObject"
- NSObject を継承したクラスという意味になります。
- property textField : missing value
- IBOutlet というものを宣言しています。missing value というコードが付いているものがアウトレットになります。
- on fortune_(object) 〜 end fortuen_
- この二行に囲まれたコードがメソッドになります。AppleScriptObjC では通常のメソッドと IBAction との間でコーディングの違いはありません。ここではまだメソッドの中身はありません。
GUI レイアウト 次にアプリケーションの見た目を作ります。プロジェクトウィンドウの左ペインで MainMenu.xib を選択すると、中央のエディタペインとの間に縦のスペースが現れます。その中で一番下のアイコンを選択すると中央のエディタペインにアプリケーション・ウィンドウが表示されます。次の図のようにプッシュボタンとラベルを配置してウィンドウの大きさも調整してください。Label の幅もプッシュボタンと同じ幅まで広げてください。
次に右ペインの下側のライブラリより Object (青色の正立方体) を左ペインの縦のスペースまでドラッグ & ドラッグします。
そして、縦のスペースの Object を選択したまま、右ペイン上側のインスペクターペインで、左から三番目の Show the Identity Inspector タブを選び、Class ポップアップメニューから、先ほど作成した Controller を選んでください。
View と Controller を接続する ビューとコントローラを接続します。Fortune にはモデル (Model、データ部分) はありません。
プッシュボタンを右クリックしながら、縦スペースの Controller までドラッグします。接続線が伸びていきます。Controller の上でマウスボタンを離すと選択肢が現れますので generate: を選んでください。
次に、縦スペースの Controller を右クリックして、そのままラベルまでドラッグします。接続線が伸びていきます。ラベルの上でマウスボタンを離すと選択肢が現れますので textField を選びます。
以上で、プッシュボタンをクリックすると、Controller の fortune メソッドに命令が送られ、fortune が行った仕事の結果が Lbel に表示されるという関係が確立されました。ここで再び、プロジェクトウィンドウ左上の右三角をクリックして Fortune を起動してみましょう。fortune メソッドの中身がまだコーディングされていないので「今日の運勢」ボタンをクリックしても何も起こりません。
fortune メソッドのコーディング 左ペインで Controller.applescript を選択して、generate メソッドを次のようにコーディングしてください。赤色の部分が追加するコードです。
on fortune_(object) set num1 to random number 9 set col1 to some item of {"Purple", "Navy", "Brown", "Green"} textField's setStringValue_(col1 & " and " & num1) end fortune_
コード説明
2行目:set num1 to random number 9
num1 という変数に「random number 9」というコードで作られた 0 から 9 までのランダムな数値を設定しています。
3行目:set col1 to some item of {"Purple", "Navy", "Brown", "Green"} col1 という変数に「Puple、Navy、Brown、Grenn」の中からランダムに選ばれた色の名前を設定しています。
4行目:textField's setStringValue_(col1 & " and " & num1) textField に setStringValu メソッドを使って引数の「col1 & " and " & num1」で作られた文字列を設定しています。& 演算子は文字列を連結する働きがあります。
実行結果
実行結果は次のようになります。「今日の運勢」ボタンをクリックすると Label に今日のラッキーカラーとラッキーナンバーが表示されます。
さらに磨きをかける ところで、Fortune が起動した時にラベルが「Label」のままでは少し変です。そこで起動した時にラベルに日時が表示されるようにしましょう。Controller.applescript に赤で示したコードを追加してください。
script Controller property parent : class "NSObject" property textField : missing value on fortune_(object) set num1 to random number 9 set col1 to some item of {"Purple", "Navy", "Brown", "Green"} textField's setStringValue_(col1 & " and " & num1) end fortune_ on awakeFromNib() textField's setStringValue_((current date) as text) end awakeFromNib_ end scriptawakeFromNib メソッドは、MainMenu.xib がロードされた時に (つまりアプリケーションが起動した時に) 、MainMenu.xib に登録されているすべてのオブジェクトで呼び出されるメソッドです。ここではオブジェクトではなく「クラス」と言ったほうが分かりやすいかもしれませんね。そして「textField's stringValue_()」で引数の文字列をラベルに表示される文字列を設定しています。引数の「((current date) as text)」では、curennt date で現在の日時を取得し、その日時データを as text で文字列に変換しています。日時データは通常の状態では文字列にはなっていません。
第1章の終わりに おめでとうございます。これで最初の AppleScriptObjC アプリケーションが無事に完成いたしました。第2章では、GUI を持たないプログラムを作りながらもう少し AppleScript の文法に踏み込んでいきたいと思います。
無断転載禁止
Copyright 2014. applescriptobjc.jp All right reserved.