![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ||
![]() | ![]() | ![]() | ![]() | ![]() |
|
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
以下は、Mac OS X 10.4.11 上の Xcode 2.5 で説明しています。BlankWidgetで解説したことは繰り返しませんので、そちらを参照してください。
ウェジェットプラグインを使う進んだウィジェットです。Cocoa と JavaScript の間でデータを渡すことを可能にする、Coroa と JavaScript を橋渡しするウィジェットプラグインを含んでいます。
注意:最初に /SimplePlugin/ で見つかる SimplePlugin をコンパイルし、結果のファイルである SimplePlugin.widgetplugin を Fortune ウィジェットパッケージのルートに置きます。それから、パッケージがウィジェットとして有効になるように、.wdgt 拡張子を追加します。
上の Read Me.rtf の説明どおりにウィジェットを作り、それからインストールすると以下のようになります。背景画像は「フォーチューンクッキー(おみくじ入りクッキー)」を意識したものだと思われます。
![]() |
中央の部分には「Click here to obtain a fortune.(おみくじを得るには、ここをクリックしてください。)」とあります。クリックすれば、ランダムでおみくじが表示されます。
![]() |
上の例では、真ん中の文字列が「you need not worry about your fortune.(自身の運命について心配する必要はない。)」という風に変わります。この新しい文字列はプラグインを使って、Objective-C クラスから取得されたものです。もちろん、JavaScript にも文字列配列と乱数があるので、同様の結果を作り出すことは簡単です。ここでは、プラグイン使用の例として、Objective-C クラスから文字列を取得しています。
ウィジェット本体について説明する前に、プラグインについて説明します。プラグインがどのように動作するのかを先に説明したほうが、それを JavaScript から呼び出した時の動作が理解しやすいと思われるからです。
Xcode 2.5 では、Dashboard プラグインというようなプロジェクトテンプレートはありません。「Cocoa Bundle」を新規プロジェクトとして作成し、それを修正することになります。
このサンプル内に「SimplePlugin」というフォルダがありますが、このなかに「SimplePlugin.xcodeproj」というプロジェクトファイルがあります。これがプラグインプロジェクトです。これを Xcode で開きます。
SimplePlugin.xcodeproj でのファイル構成は以下のようになっています。
![]() |
ここで、MyPluginClass.h と .m がプラグインを定義しているファイルになります。WebKit フレームワークとリンクされている点に注意してください。
まず MyPluginClass.h を見てみます。これは以下のようになっています。
インスタンス変数が宣言されているだけです。このインスタンス変数は、出力したおみくじの番号を保存しておくためのものです。
ヘッダとは別に、MyPluginClass.m の最初に変数が定義されています。これも見てみましょう。
定数 NUM_QUOTES は、引用文の数で、つぎの quotes[] 配列が引用文自体を定義しています。
つぎに初期化を行うメソッドを見てみます。『Dashboard プログラミングトピック』の「ウィジェットプラグインの作成」にあるように、これは必ず実装しなければならないメソッドです。プラグインが読み込まれたときに Dashboard がこのメソッドを実行します。
まず、コメントアウトされていますが、デバッグ用のログ出力があります。デバッグ時や動作を調べたい時には、コメントでなくします。次にスーパークラスの初期化をし、引用文をランダムに選ぶ時に使う乱数の初期化を行っています。
time は C 言語標準ライブラリの time.h で宣言されている関数で、現在時刻を time_t 値(10.4.11 では long)として返します。srand も標準ライブラリ関数で stdlib.h で宣言されているもので、同じライブラリ関数 rand() を使うときに返される乱数を初期化します。ここで引数には unsigned の種をとり、それを使って初期化を行います。種を変えれば、違う乱数が生成されます。
ちなみに、C 言語標準ライブラリの乱数は生成が速いですが、筆者の学習以後に大幅に改装されないないかぎり、出てくる乱数はあまりランダムではありません。ここでは単に引用文を選ぶだけなので、この乱数で十分ですが、ランダムであることが重要な場合(シミュレーションや統計)には、使わないように気をつけてください。逆に適当に速く乱数がほしい場合は C 言語ライブラリの乱数を使います。
さて、初期化と対応して、割り当て解除メソッドも見てみましょう。
このクラスでは、インスタンス変数としてオブジェクトを使用したり、保持しているものがないので、スーパークラスの実装を呼んでいるだけです。
『Dashboard プログラミングトピック』の「ウィジェットプラグインの作成」にあるように、WebScripting 簡易プロトコルとは別に、JavaScript と Objective-C 言語プラグインとの橋渡しをするオブジェクトをバインドする必要があります。
ここでは、プログラミングトピックで最小限含めたほうがいいとされている1行があるだけです。これにより、JavaScript 内で「FortunePlugin」という名前で、このオブジェクトが参照できるようになります。
プラグインを実際に使うときには、当然なことながら、プラグイン独自の何らかの作業をするメソッドを含んでいるはずです。それらのメソッドを JavaScript 側から便利に呼び出せるようにするため、WebScripting 簡易プロトコルを実装します。これを実装しなくても、上の橋渡しオブジェクト内でキーをかいしてメソッドを利用できますが、デフォルトの名前になります。使われる名前を自分で設定したい場合、以下のメソッドを実装することになります。
クラスメソッドであることに注意してください。渡されたセレクタに対して、JavaScript 内で使える名前を返します。ここでは、getFortune と logMessage: の場合、それらを返しています。このクラスの場合、メソッド名が単純なので、じつはこれを実装しなくても、たいした違いはなかったりします。くわしいことは、WebScripting リファレンスのこのメソッドの説明を見ればわかりますが、getFortune のデフォルト名はそのまま getFortune で、logMessage: の場合は logMessage_ となります。
この WebScripting プロトコルには、メソッドセレクタではなく、属性を呼ぶためのキーを変更したりするメソッドや、特定のメソッドを JavaScript から隠したりするためのメソッドなども宣言されています。
プラグイン特有の作業を行うメソッドは、getFortune と logMessage: です。
まず最初に乱数を取得して、それを引用文の数で割っています。つぎにインスタンス変数とその乱数を比較します。同じなら、直前と同じものを返すので、別のものを返すようにしています。それから返す予定の番号を保存しておき、配列から引用文を返しています。
単に NSLog でコンソールにログ出力しているだけです。コメントにもあるとおり、このメソッドは必要ではありません。JavaScript の文字列が Objective-C メソッドに NSString* として変換して渡されていることを確認するためのものです。
さて、これでプラグインの説明はおしまいです。非常に単純な構造になっているのがわかったと思います。これをビルドすれば、SimplePlugin.widgetplugin が作られます。Read Me.rtf にあるように、これをウィジェットパッケージのルートに置くことになります。また、ウィジェット自体の Info.plist に、Plugin キーとしてこれが指定されていることに注意してください。
さて、プラグインをビルドしてコピーした後のウィジェットのファイル構成は以下のようになります。
![]() |
Default.png は、ウィジェットの文字を除く背景が含まれている画像です。Icon.png は、アイコンです。主要 HTML ファイルは、Fortune.html です。CSS ファイルは Fortune.css です。スクリプトファイルは、Fortune.js です。
このサンプルには Apple クラスが含まれていませんが、アニメーションなどの Apple クラスが使われています。このため、v10.4.3 より前だと動作しないので気をつけてください。
それでは、主要 HTML ファイルを見てみます。
コメントにあるように、body 要素に onclick ハンドラが設定されていることに注意してください。単純なので、あとはわかると思います。
スタイルシートは、特別な設定は何もありません。気になる方は、サンプル内のファイルを見てください。
このサンプルの中心となるのがこのファイルです。ここでプラグインのメソッドを使用しています。プラグインの読み込みや初期化は、Info.plist に指定されていたので、ウィジェット読み込み時に、ウィジェットを表示する際のウェブビューの初期化の一環として実行されることに気をつけてください。HTML や JavaScript ファイル時で初期化をする必要はありません。プラグイン自体で読み込まれた時の初期化メソッド等を実装するだけです。
このファイル内では関数外コードがなく、変数が 1 つだけ関数外で宣言されています。これはさまざまな関数で使われるアニメーションオブジェクトを保存しておくためのものです。
このウィジェットにはよくある onload ハンドラがなく、かわりに onclick ハンドラが設定されていました。そのため、単にウィジェットが読み込まれても、JavaScript が実行されるわけではありません。特別な初期化は行われません。ウィジェットのどこかがクリックされたとき、初めて next() が呼び出されることになります。
単に他の関数を呼び出しているだけです。それらの関数を見ていきます。まず hideContent() です。
アニメーションについては他のサンプルで説明していますので、細かい所は省きます。後の showContent() がファイル内では先になっていてコメントがくわしいので、気になる方はそちらを見てください。id が「quote」である要素の不透明度を 0 にするようなアニメーションを実行します。すなわち、表示されている文字列がじょじょに見えなくなります。
つぎに、swap() です。
プラグインがあるかチェックして、それからプラグインから引用文を取得します。プラグインのメソッドであるものの、JavaScript 関数のように普通に使われていることに注意してください。Objective-C メソッドの利用はごく簡単です。
「quote」要素内に新しいおみくじが入れられたので、次はそれをフェードインして表示するだけです。
簡単なので、くわしい説明はしません。これで next() の内容がわかったと思います。各フレームごとのアニメーションを実行するメソッドも定義されていますが、他サンプル等と似たものなので、ここでは説明しません。
プラグインを示すサンプルなので、本体自体はとても単純です。ウィジェットからのプラグイン使用も、またプラグインの作成も非常に簡単なものであることがわかったと思います。
プラグインには、logMessage: というメソッドが定義されていましたが、残念ながら、このファイル内では使われていません。実験してみたい方は、適当な部分にログ出力を入れて、ためしてみるといいでしょう。
管理人:神吉 秀典 E-mail: