ASOCでアプリケーションを作ってみる-04-Xcode3.2
前回ですばらしいアプリケーションはおおよそ完成ですが、目の前で何も起こらないと手応えがないので何か起こるようにしましょう。
オブジェクトの値を操作する
インターフェース上で何かを起すというのはつまり、インターフェースの値を取得したり設定したりということになりますので、その辺りを作ってみましょう。
テキストフィールドの値を取得する
では、property に オブジェクトを接続して値を取得する方法で話を進めます。
では値を取得する必要の在るテキストフィールドと値を設定する必要の在るラベルのpropertyを以下の様に書き込みます。
property myTextField : missing value -- テキストフィールド
property myTextLavel : missing value -- ラベル
上を保存し、interface Builderに戻ってpropertyにオブジェクトを接続します。
接続されると左のような状態になります。interface Builderでは接続されたオブジェクトのOutlet(出口、というかコンセントというイメージでしょうか?)として認識されています。
上を保存し、Xcodeにもどり以下のようにハンドルを修正します。
on clickButton_(sender)
log "ボタンがクリックされましたの1"
set textFieldValue to myTextField's stringValue --テキストフィールドの値を取得
log textFieldValue
set textFieldValue to stringValue of myTextField --テキストフィールドの値を取得
log textFieldValue
end clickButton_
2つの書き方でテキストフィールドの値を取得させていますが、両方ともAppleScriptで使用できる書き方で、ただAppleScriptObjCの場合は多くがObjective-Cの書き方に近づいているため、最初の方の『myTextField's』の書き方がこの先は一般的になってくるのではないかと思います。私はずっと下で書いていたので、まだちょっと違和感があるのですが・・・。
保存して実行しログを見ると2回テキストフィールドの値が書き出されているはずです。
使用できるメソッドを探す
上の例ではテキストフィールドの値を取得する為に『stringValue』という命令を使用しています。ではこれはなんなのでしょう?
実はこれはObjective-Cのmethod(メソッド)というものでAppleScriptのCommandとは違うものです。
え、じゃあそれを知らないと使えないのか、ということになりますが、調べる方法はありますし、調べ方が分かると何とか使えるようにもなります。
interface Builderに戻ってドキュメントウインドウで確認すると、テキストフィールドは『NSTextField』というタイプであるとなっています。そしてその中には『NSTextFieldCell』が入っているようです。そこでこれをヘルプ画面の検索に打ち込んで検索してみます。
Xcodeのヘルプ画面
『NSTextField』のOverView(概要)などが表示されています。勿論これをきちんと読むのは何よりも大事ではありますが、差し当たりは配置したオブジェクトであるクラスのインスタンスに何かをさせるメソッドがないかと探している訳です。
見ると真ん中辺りに『Instance Meshods』というそれっぽいものがあります。この三角をクリックしてみるとインスタンスに対するメソッドが表示されます。沢山のメソッドがあり、名前から何が出来るかが推測できます。自分の目的に適ったメソッドっぽいものを見つけてクリックし、内容を読んでみるといいかと思います(英語なのですが・・・)。
さて、テキストフィールドに値を設定するメソッドはどうもここにはなさそうです。仕方ないので次の『NSTextFieldCell』も検索してみます。が、やっぱりないようです。どうやら値はもっと奥の何処かにしまわれているようで。では更に奥に何が有るかはどうやったら分かるのでしょうか?。
もういちどinterface Builderに戻って、今度はリソースパネルのClassタブを選択し、その中の『NSTextFieldCell』見つけてクリックしてみます。
すると以下のように更に奥の継承を追うことができます。
面倒ですが、順番に検索し、インスタンスのメソッドを眺めて行きます。この場合『NSCell』の中に『setStringValue』を見つけることができました。またこの中には『StringValue』もあります。どうやらこれっぽいのでクリックして中を確認します。
『StringValue』と『setStringValue』の内容を以下に書き出してみます。
stringValue
Returns the value of the receiver’s cell as an NSString object.
- (NSString *)stringValue
Return Value
The string value of the cell. This value may be an interpreted version of the cell's actual value. Interpretations are performed by the cell's formatter.
setStringValue:
Sets the value of the receiver’s cell using an NSString object.
- (void)setStringValue:(NSString *)aString
Parameters
aString
The string value of the cell.
どうやら以下が使い方ということになりそうです。
- (NSString *)stringValue
- (void)setStringValue:(NSString *)aString
end clickButton_
これはAppleScriptの書き方ではなく、Objective-Cでの書き方になります。なので最初の()で括られている部分が返り値(Return Value)になり、後ろの:()になっている部分が渡すべき変数の型ということになります。(void)は何も返さないよということを表しています。
つまり、『stringValue』はCellの値をとって『NSString』というクラスの型で返すよ、ということで、『setStringValue』は『NSString』の型の変数で値を渡すとセットしてくれるよ、ということになります。
テキストフィールドの値を設定する
ではこれをAppleScriptObjCではどのように使うかというのが以下になります(stringValueは先ほど使いました)。
set textFieldValue to myTextField's stringValue --テキストフィールドの値を取得
myTextField's setStringValue_(textFieldValue) --テキストフィールドに値を設定
注意が必要なのは『setStringValue_』の最後にアンダースコアが付いている事です。これもObjective-Cでの書き方に依拠したもので、『setStringValue:(NSString *)』の『:』は変数の数を反映していて、AppleScriptObjCではそれを『_』とアンダースコアで置き換えるお約束になっているからです。これはObjective-CのメソッドだけでなくAppleScriptObjCのクラスに登録されたハンドルの命名規則にも当てはまるお約束事になります。(AppleScriptのScriptObjjectとして扱う場合はこの規則は適用されません)この辺りはややこしいので別項で検証したいと思っています。
では上記にそってボタンのアクションハンドラを以下のように修正します。
on clickButton_(sender)
log "ボタンがクリックされましたの1"
set textFieldValue to myTextField's stringValue --テキストフィールドの値を取得
log textFieldValue
myTextLavel's setStringValue_(textFieldValue)
end clickButton_
これで保存して実行すると、無事入力したテキストフィールドの内容がボタンを押す事でラベルの内容に反映されているかと思います。
めでたしめでたし・・・の前にもう一つ。
ASOCでアプリケーションを作ってみる-03-Xcode3.2 |
AppleScriptObjC |
ASOCでアプリケーションを作ってみる-05-Xcode3.2 |