タイトル鶴薗賢吾のCocoaはやっぱり!出張版》#4-Mac OS X 10.1の新機能(3)カテゴリーCocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/10/4 16:3:4作成者新居雅行
■ Application Kitの新機能

◎ドックによる通知

バックグラウンドで動いているアプリケーションから「 エラーが発生した 」や「 メールが着信した 」などのユーザーへの通知がある場合に、ドック内のアプリケーションアイコンをバウンドさせるという通知方法が新たに追加されました。以下のような感じになります。

図. ドックの通知でアプリケーションアイコンがバウンドしたところ
 

NSApplicationのrequestUserAttention : メソッドで、通知を行うことが出来ます。通知の種類には、一度だけジャンプするものと繰り返しジャンプするものの2種類があります。

★NSApplication : ドックによる通知を行う
[書式] - (int) requestUserAttention : (NSRequestUserAttentionType) reqType
[入力] reqType : 通知の種類
[出力] 返り値 : 通知の識別番号 ( キャンセルするときに使用する )

// NSRequestUserAttentionType: ドックによる通知の種類
enum {
NSInformationalRequest = 0, // 一度だけジャンプ
NSCriticalRequest = 1 // 繰り返しジャンプ
} NSRequestUserAttentionType;

この通知は、通知を出したアプリケーションがアクティブなった時点で自動的に止まりますが、「 1分経過したら通知をやめる 」など、強制的に止めたい場合は、cancelUserAttentionRequest : メソッドを使います。同時に複数の通知が発生することも考えられますので、そのために、どの通知を止めるのかを指定しなければなりません。requestUserAttention : の返り値が通知の識別番号になりますので、それを記憶しておいて、中止するときに使います。

★NSApplication : ドックによる通知を中止する
[書式] - (void) cancelUserAttentionRequest : (int) request
[入力] request : 中止したい通知の識別番号

使用例を以下に書きます。NSAppというのは、NSApplicationクラスのインスタンスでアプリケーション自身を指しています。Application Kitのグローバル変数なので、アプリケーションのどこからでも使えます。

int iReqNo = [ NSApp requestUserAttention : NSCriticalRequest ]; // 通知開始
: 何か処理をする
[ NSApp cancelUserAttentionRequest : iReqNo ]; // 通知中止

また、バックグラウンドアプリケーションが、アラートなどのモーダルパネルを表示した場合は、自動的にrequestUserAttention : が呼ばれますので、通知の処理は不要です。

◎アプリケーション独自のドックメニュー

Mac OS X 10.0.4までは、ドックのアプリケーションのアイコンからポップアップされるメニューの中身は、予め決められたものしか表示できず、独自のメニューを表示することは出来ませんでした。Mac OS X 10.1では、アプリケーションが独自のメニューを追加することが出来るようになり、ドックからアプリケーションをコントロールできるようになりました。

図. メニューをドックに登録する手順
 

パレットウィンドウからMainMenu.nibへメニューをドロップします…1。すると、メニュー編集ウィンドウが表示されますので、メニュー項目のタイトルを「 Prev 」と「 Next 」と変えます…2。File’s owner ( この場合はNSApplication ) にはdockMenuというアウトレットが増えていますので、ここに今作ったメニューを接続します…3,4,5。これで、ドックのメニューに割り当てられます。それぞれのメニュー項目に、実行したいアクションを接続すれば、準備完了です。実行すると以下のようになります。PrevとNextがメニューに組み込まれているのが分かります。

図. ドックのメニューを表示したところ
 

メニューの中身が常に変わらない場合は、これで終わりですが、ダイナミックにメニューの中身を変えたい場合もあります。この場合は、アプリケーションのデリゲートのインスタンスにapplicationDockMenu : メソッドを書いておきます。このメソッドは、ドックのメニューがポップアップする直前に呼ばれますので、表示したいメニューを作成して返り値として返します。そうすると、返したメニューがドックに表示されます。

- (NSMenu *) applicationDockMenu : (NSApplication *) sender {
[ songMenuItem setTitle : @"Kero song Tambo mix" ];
return( dockMenuBase );
}

このサンプルでは、メニューをゼロからは作成していません。予め以下のようなメニューをInterface Builder上で作って、dockMenuBaseというアウトレットで参照できるようにしておきます。さらに、一番下のメニュー項目をsongMenuItemという名前のアウトレットとして参照できるようにして、このメニュー項目のタイトルを書き換えて、dockMenuBaseを返り値としています。メニューの項目数が変わらない場合は、こういうやり方がお手軽でしょう。

図. ダイナミックなメニューのための雛形とそのアウトレットの名前
 

実行結果は以下のようになります。Mac OS X 10.1に付属のiTunesにもこのようなメニューが表示されますが、このような方法で実現できるわけです。

図. ダイナミックなドックのメニューを表示したところ
 

◎音声合成

NSTextViewには、音声合成の機能がつきました。テキストを選択してコンテキストメニューを表示すると、「 スピーチ 」メニューが表示されます。

図. コンテキストメニューから音声合成を行うところ
 

この音声合成の機能をアプリケーション側から利用する方法を説明します。やり方としては、かなり邪道かもしれませんが、手軽にできる方法です。画面に表示しないウィンドウを1つ作ってNSTextViewを配置して、しゃべって欲しい文字列をセットしてから、「 startSpeaking : 」メソッドを呼び出すのです。

textViewというアウトレットを作って、そのNSTextViewを接続して、以下のようにするだけです。「 My name is Kero. 」としゃべってくれるはずです。

// NSTextViewに文字列をしゃべらせるサンプル
[ textView setString : @"My name is Kero." ];
[ textView startSpeaking : self ];

[鶴薗賢吾]
関連リンクCocoaはやっぱり!