• 検索結果がありません。

@interface + [ NSWindow alloc ] NSWindow alloc - [ NSWindow center ] NSWindowcenter

N/A
N/A
Protected

Academic year: 2021

シェア "@interface + [ NSWindow alloc ] NSWindow alloc - [ NSWindow center ] NSWindowcenter"

Copied!
136
0
0

読み込み中.... (全文を見る)

全文

(1)

1

-COCOYAPA!

COCOA TIPS COLLECTION

cocoaNote :

version 20050424.117

(2)

@interface thisDocument このドキュメント " cocoaNote : " は、日頃、私が Cocoa プログラミングをしているときにあれこれと調 べものしたものをまとめたものです。Cocoa のプログラミングをしていて「 これってどうやるんだろ? 」と 思った時に、このドキュメント内を検索してもらえるとズバッと解決するようなものを ( 一応 ) 目指していま す。検索がしやすいように、各項目には検索キーワードを設けてありますので、いくつかの検索キーワードで 検索してみてください。もし思った検索キーワードで引っかからなかった場合、ご連絡いただけるとありがた いです。 Cocoa のプログラミングを始めた頃につまづくかなと思われるものは取り上げるようにしていますので、 基本的すぎるものも含まれているかと思いますが、誰もが一度は通る道と思われるものは簡単かどうかに関係 なく掲載しています。また、Cocoa を中心にしていますが、場合によっては、Cocoa のフレームワークだけ では解決できないものもありますので、CoreFoundation だったり Carbon だったり AppleScript などを使 って解決しているものもあります。そういう意味では Cocoa Tips という枠にはあまりこだわっていません。 まだ書き始めたところですので完成度的にはまだまだというところが多々あるかと思いますが、徐々に完成 度を高めていく予定です ( ということで温かい目で見てやってください )。このドキュメントは誤りがないよ うにしていますが、内容を保証するものではありません。このドキュメントを参考にしたことによる、いかな る損害について保証はいたしませんのでご了承ください。もっといい方法とか、もっと推奨される方法とか、 これはまずいとかがありましたらお知らせいただくとありがたいです。 @end このドキュメントで用いている記述方法について ●メソッドの表記

  + [ NSWindow alloc ] → NSWindowのクラスメソッドのallocメソッド。   - [ NSWindow center ] → NSWindowのインスタンスメソッドのcenterメソッド。

(3)

3

-目次

1. 開発環境 ... 8

1. OBJECTIVE-C のメソッド名のコロンを揃える 8 2. メソッド一覧メニューを変更する 9 3. ヘッダの変更を INTERFACE BUILDERへ知らせる 10 4. ビューを他のウィンドウへ移動する 11 5. アイコン付きのラジオボタンを作る 12 6. ソースファイル個別にコンパイルスイッチを追加する 13 7. 起動パラメータを指定する 14 8. 起動パラメータを取得する 15 9. デバッグ時にオブジェクトの中身を表示する 16 10. デバッグ時にグローバル変数の中身を表示する 17 11. メモリリークのチェック 19 12. ブレークポイントを一時的に無効にする 21 13. ブレークポイントに条件をつける 22 14. スレッドのスイッチングを抑制する 23 15. 開発環境以外でクラッシュしたときのデバッグ情報の取得 24 16. ビルドスタイルの変更 25 17. バージョン番号を変更する 26 18. アバウトパネルをカスタマイズ 27

2. 文字列 ...28

19. 数値を文字列に変換する 28 20. 文字列を数値に変換する 29 21. スペースで区切られた文字列を分解する 30 22. ローカライズされた文字列リソースを読み込む 31 23. NSTEXTFIELDで文字列の省略表示を行う 32

3. 日時...34

24. 現在の日時を取得 NSDATE 34 25. 特定の月の日数を取得 / 閏年の判定 36 26. 指定時間スリープする 37

(4)

4. アプリケーション ...38

27. アプリケーション自身のインスタンスを取得 38 28. アプリケーション自身のフルパスを取得 39 29. リソースファイル格納フォルダのフルパスを取得する 40 30. リソースファイル格納フォルダ内のファイルのフルパスを取得する 41 31. 実行ファイルのフルパスを取得する 42 32. アプリケーション名からフルパスを取得 43 33. アプリケーションをアクティブにする 44 34. アプリケーションの終了時の処理 45 35. アプリケーションの終了をキャンセルする 46 36. アプリケーションの終了確認を行う 47 37. アプリケーションの終了を延期する 48 38. 最後のウィンドウが閉じられたら終了する 50 39. ドックのアプリケーションアイコンを変える 51 40. ドックのアイコンをジャンプさせる 52 41. 他のユーザでの同時起動を禁止する 54 42. アプリケーションを DOCKに表示させない 55 43. 環境設定の初期値を設定する 56 44. NSCOLORを環境設定に保存する 57 45. NSCOLORを環境設定から読み込む 58

5. ウィンドウ...59

46. ウィンドウの位置を保存/復帰する 59 47. ウィンドウをセンタリングする 59 48. ウィンドウをフェードイン/フェードアウトさせる 60

6. アラート ...61

49. アプリケーションモーダルアラートを表示する 61 50. スレッドを止めない単体のアラートを表示する 62 51. シートアラートを表示する 63

7. イベント ...65

(5)

5 -55. ボタンの長押しを処理する 69

8. メニュー ...71

56. メニューアイテムの使用可/不可を制御する 71 57. メニューバーを隠す 73

9. テーブル ...74

58. NSTABLEVIEWの基本制御 74 59. NSTABLEVIEWにデータを表示する 75 60. セルの有効/無効を制御する 77 61. テーブルにチェックボックスを付ける 78

10. ペーストボード ...79

62. ペーストボードへの画像の書き込み 79

11. グラフィック ...80

63. 影付きの描画を行う 80 64. 画像リソースを読み込む 81 65. NSIMAGEが対応している画像形式を調べる 81 66. ファイルのアイコンを取得 82 67. ファイルのアイコンを画像ファイルとして保存 83 68. 手軽にアニメーションを表示する 84 69. FLASHを表示する 84

12. サウンド...85

70. 警告音を鳴らす 85 71. サウンドリソースを鳴らす 85 72. 音声の再生完了時の処理 87 73. スピーチシンセサイザの声をファイルに保存する 88

13. スクリーン ...89

74. メインスクリーンの情報を取得 89 75. メニューバーの存在するスクリーンの情報を取得 90 76. スクリーンの解像度を取得 91 77. 全てのスクリーン情報を取得 92 78. スクリーンの解像度や色数を変更する 93

(6)

79. QUARTZ EXTREMEに対応しているかを調べる 94

14. ファイル...95

80. 指定フォルダの中のファイルリストを取得する 95 81. 指定フォルダの中のファイルリストをフルパスで取得する 96 82. 現在のユーザのホームディレクトリを取得 97 83. FINDERに指定のファイルを表示させる 98

15. ネットワーク ...99

84. AIRPORT ( AIRMAC ) を制御する 99 85. 現在接続している無線 LAN の SSID を取得する 100 86. 通信のパケットをモニタする 101 87. メールを送信する 103

16. WebKit ... 104

88. WEBVIEWに指定の URL を表示させる 104

17. プロセス/スレッド ... 105

89. アクティブなアプリケーションを取得 105 90. 起動している全アプリケーションのリストを取得 107 91. 他のアプリケーションの起動を検知する 108 92. スレッドのプライオリティの変更 109 93. UNIX コマンドを実行する 110

18. オペレーティングシステム... 111

94. MAC OS のバージョン番号を取得 111 95. MAC OS のビルド番号を取得 113 96. OS やプロセスなどの詳細情報を取得 114 97. コンピュータ名 ( ホスト名 ) を取得 115 98. 現在のユーザ名を取得 116 99. ファストユーザスイッチの通知 117

19. ハードウェア ... 119

(7)

7 -103. バッテリの状態を取得する 121 104. AC が接続されているか取得する 123 105. バッテリの残り時間を取得する 124 106. バッテリが充電中かを取得する 125 107. バッテリの充電完了までの時間を取得する 126 108. 省電力機能によるスリープを禁止する 127

20. その他 ... 128

109. システム環境設定の特定の項目を開く 128 110. 爆発アニメーションを表示する 129 111. APPLESCRIPTファイルを実行する 131 112. 文字列の APPLESCRIPTを実行する 133 113. APPLESCRIPTから文字列データを取得する 134 114. APPLESCRIPTから配列データを取得する 134 115. MUTABLEでないオブジェクトから MUTABLEなオブジェクトを得る 135 116. MUTABLEなオブジェクトから MUTABLEでないオブジェクトを得る 136 117. COREFOUNDATIONのオブジェクトをオートリリースする 136

(8)

1.

開発環境

1.

Objective-C のメソッド名のコロンを揃える

● Preferences > Indentation を使う

Xcode 1.5

Objective-C のメソッド名のコロンの位置を揃えたい場合は、Xcode の [ Prefercenes ウィンドウ > Indentation ] を使います。[ Syntax-aware indenting ] にチェックを付けて、[ Auto-indent characters : ] の コロンのところにチェックを付けておきます。すると、ソースコードエディタでコロンを入力した時にコロン の位置が調整されます。

ただし、メソッド名が行の先頭にあることを前提にした動きをしますので、メソッド名が行頭に来ないよう な書き方をする場合は、注意が必要です。

(9)

9

-2.

メソッド一覧メニューを変更する

● #pragma mark を使う

Xcode 1.5 ソースコードを編集するウィンドウには、メソッド等の先頭にジャンプするポップアップメニューがありま す。「 #pragma mark メニュー項目名 」を使うと自由にアイテムを追加することが出来ます。メソッドや関 数のグルーピングを明確にしたいときなどに有効です。

(10)

3.

ヘッダの変更を Interface Builder へ知らせる

● ヘッダーファイルを nib ファイルのウィンドウへドロップする

Xcode 1.0∼

Interface Builder 上で nib ファイルを開いている状態で、Xcode 上で、その nib ファイル内に存在してい るインスタンスのクラスのヘッダファイルを変更した場合、nib ファイルとの間で定義が食い違ってしまいます。 その場合は、Xcode のヘッダファイルをドラッグして、Interface Builder 上で開かれている nib ファイルの ウィンドウへドロップすることで、nib ファイル内の定義を更新することが出来ます。

(11)

11

-4.

ビューを他のウィンドウへ移動する

● マウスプレス&ドラッグを使用する

一旦配置したビューを他のウィンドウに移動させたり、他のビューの子供にしたいときがあります。ビュー をカットしてペーストする方法もありますが、そのビューへのコネクションが切れてしまいます。この場合、 移動したいビューを選択した状態でマウスボタンを長押しすると、ビューが浮いたような状態になりますので、 そのまま移動したい先までドラッグすることができるようになります。この場合はコネクションも切れずに済 みます。 浮いた状態のビュー

(12)

5.

アイコン付きのラジオボタンを作る

● NSMatrix > Radio Mode と NSButtonCell > On/Off Behavior を使う

Xcode 1.0∼

画像付きの複数のプッシュボタンをラジオボタンのように 1 つだけハイライト表示になるようにするのは、 以下の手順で実現できます。

1. NSButton を配置したのち、オプションキーを押したままサイズ変更をして NSMatrix に変更します。 2. NSMatrix の属性の [ Mode : ] を [ Radio ] にします。

(13)

13

-6.

ソースファイル個別にコンパイルスイッチを追加する

● ソースファイル > Get Info > Build を使う

Xcode 1.5∼

特定のソースファイルだけコンパイルスイッチを追加したい場合は、Xcode のプロジェクトウィンドウの 「 Group & Files 」のところでファイルを選択し、Control + クリックで表示されるメニューから「 Get Info 」 を選びます。これで表示されるウィンドウの Build タブをクリックすると、追加したいコンパイルスイッチを 入力するエリアが表示されますので、ここに入力します。

(14)

7.

起動パラメータを指定する

● Executables > > Arguments を使う

Xcode 1.5

Xcode のプロジェクトウィンドウで [ Group & Files > Executables > 実行ファイル ] を選択してコンテキ ストメニューから [ Get Info ] を実行。情報ウィンドウの Arguments タブの上段の Arguments が起動パラ メータになります。[ + ] ボタンをクリックして内容を入力すると、それが起動時のパラメータになります。一 時的に、パラメータを無効にするには、左側にあるチェックボックスのチェックを外します。

(15)

15

-8.

起動パラメータを取得する

● - [ NSProcessInfo arguments ] を使う

Xcode 1.5 指定された起動パラメータを取得するには、- [ NSProcessInfo arguments ] を使います。文字列の配列で 取得できます。 (SAMPLE) 起動パラメータを取得する

NSArray* args = [ [ NSProcessInfo processInfo ] arguments ];

(16)

9.

デバッグ時にオブジェクトの中身を表示する

● Print Description to Console メニューを使う

Xcode 1.5

デバッグ中に NSArray や NSDictionary などのオブジェクトの中身を見たい場合は、デバッガ機能の [ Print Description to Console ] メニューを使います。[ デバッガウィンドウ > Variables ] で表示したいオブジェ クトを選択し、[ Debug > Variables View > Print Description to Console ] を使うことで、コンソールに オブジェクトの内容が表示されます ( コンテキストメニューにもこのメニューはあります )。

● GDB > print-object ( po ) コマンドを使う

Xcode 1.5

デバッグ中に NSArray や NSDictionary などのオブジェクトの中身を見たい場合は、GDB の「 print-object 」 コマンドを使います。[ Debug > Console Log ] メニューを選択してコンソールウィンドウを表示し、 「 print-object <表示したいオブジェクトの名前> 」とコマンドを入力します。省略形として「 po 」も使えま す。

補足:「 Print Description to Console 」でも「 printo-object 」でも、表示される内容は、そのオブジ ェクトの description メソッドが返す文字列です。ですので、有益な情報が表示されるかどうかは、そのオ ブジェクト次第です。

検索 キーワー ド:NSArray の中身を 表示、 NSArray の中 身を見る 、NSDictionary の 中身を表 示、 NSDictionary の中身を見る

(17)

17

-10. デバッグ時にグローバル変数の中身を表示する

● Global Browser を使う

Xcode 1.5

デバッグ時にグローバル変数を見るには、Global Browser を使います。[ Debug > Tools > Global Variables... ] メニューを選択すると、Globals Browser ウィンドウが表示されます。ウィンドウの左側の Library のところには、フレームワークやクラスの一覧が表示されますので、表示したいグローバル変数を含む モジュールを選択します。すると、右側にグローバル変数の一覧が表示されます。デバッガウィンドウに常時 表示させたい場合は、グローバル変数の左側にあるチェックボックスをチェックします。

(18)

● GDB > print / print-object コマンドを使う

Xcode 1.5 コンソール画面を表示して、print コマンドを使うと、グローバル変数の表示をコンソール画面に出力するこ とが出来ます。省略形として「 p 」も使えます。オブジェクトの場合は、print-object コマンドを使います。 省略形は「 po 」です。 (SAMPLE) グローバル変数 gi の値を表示する print gi 検索用キーワード:グローバル変数を表示する、グローバル変数を見る

(19)

19

-11. メモリリークのチェック

● MallocDebug を使う

Xcode 1.5

メモリを確保したりオブジェクトを生成した後で解放し忘れるという不具合はよくありますが、それをチェ ックするためのツールが Xcode Tools の中の MallocDebug です。

1. Xcode の [ Debug > Launch using Performance Tool > MallocDebug ] メニューを選択すると、 MallocDebug が起動します。 2. MallocDebug のウィンドウの[ Launch ] ボタンをクリックすると、開発中のアプリケーションが起動し ます。 3. ウィンドウ上段の左から 2 番目のポップアップメニューから「 Leaks 」を選択すると、リークしている メモリを探し、ウィンドウの中段にリークしているメモリのトータルサイズとそのメモリの確保を行った 関数名が表示されます。 4. 関数名をクリックしていくと、末端のメモリ確保を行っている関数までの関数呼び出し履歴を見ることが

(20)

出来ます。OS の内部の関数名も表示されますので、自分の関数のところまで下がっていくことで、どの 関数からの API コールが原因かを突き止めることが出来ます。

5. メモリの状態はリアルタイムには更新されないので、必要に応じて [ Update ] ボタンをクリックして表 示を更新します。

(21)

21

-12. ブレークポイントを一時的に無効にする

● コマンドキー + クリック を使う

Xcode 1.5 ブレークポイントを削除せずに一時的に無効にするには、ブレークポイントのアイコンをコマンドキーを押 したままクリックします。有効化するには、もういちどコマンドキーを押したままクリックします。また、ブ レークポイント自身のコンテキストメニューや、ブレークポイントの一覧の左にあるチェックボックスでも変 更できます。 検索用キーワード:ブレークポイントを無効にする

(22)

13. ブレークポイントに条件をつける

● GDB > condition を使う

Xcode 1.5

Xcode 1.5 のデバッガでは条件つきのブレークポイントを設定することが出来ませんが、GDB を直接使うこ とで条件を設定することが出来ます。予め、Xcode 上でブレークポイントを設定した後、 [ Debugger > Console Log ] メニューを実行してコンソール画面を表示します。そこで info break というコマンドを入力します。す ると、現在のブレークポイントの情報が表示されます。

(SAMPLE) 現在のブレークポイントの情報を表示する

(gdb) info break

Num Type Disp Enb Address What 1 breakpoint keep s 0x00000000 "myMain.m:19 2 breakpoint keep s 0x00000000 "myMain.m:33

先頭にブレークポイントの識別番号が表示されますので、条件を設定したいブレークポイントの番号を憶え ます。そして、以下のように入力します。 (SAMPLE) 2番のブレークポイントに「 i == 5 」という条件を付加する (gdb) condition 2 i == 5 この場合、2 番のブレークポイントに来たときに「 i == 5 」という条件式が成立している時のみとまるよう になります。もう一度 info break コマンドを実行するとブレークポイントのところに条件が表示されます。

2 breakpoint keep s 0x00000000 "myMain.m:33 stop only if i == 5

(23)

23

-14. スレッドのスイッチングを抑制する

● GDB > set scheduler-locking on を使う

Xcode 1.5 Xcode 1.5 でマルチスレッドのアプリケーションをデバッグしている場合、ステップ実行でスレッドのスイ ッチすると、デバッガも別のスレッドに切り替わります。これをなるべく同一スレッドのみを表示させたい場 合は、コンソール画面を表示して、GDB の set scheduler-locking on コマンドを使います。これにより、ス イッチが抑制されます。off で解除、show scheduler-locking で、現在のモードが表示されます。

(SAMPLE) スレッドのスイッチングを抑制する

(24)

15. 開発環境以外でクラッシュしたときのデバッグ情報の取得

● コンソールアプリケーションを使う

Mac OS X 10.3.0∼ ソフトウェアを使っているユーザの環境でクラッシュが発生した時にデバッグの情報を得るためにはコンソ ールアプリケーションを使います。コンソールアプリケーションを起動して、ツールバーの中にある [ ログ ] ボ タンをクリックすると、ウィンドウの左側に 階層表示のペインが表示されます。[ ~/Library/Logs ] や [ /Library/Logs ] の中にある [ CrashReporter ] を開くとクラッシュしたソフトウェアの名前のリストが表 示されますので、該当するものをクリックします。すると、クラッシュしたときの関数の呼び出し履歴がスレ ッド毎に表示されます。

(25)

25

-16. ビルドスタイルの変更

● Development と Deployment

Xcode 1.0∼

Xcode では、プロジェクトを作成するとビルドスタイルとして Development と Deployment の二つがデフ ォルトで作成されます。Development は開発中に用いるもので、Deployment はリリース用です。Development は、デバッガでデバッグするためのデバッグ情報が出力されるためサイズが大きくなりますし、Zero Link を 使ってリンクを省略するために、他のマシンでは動作しませんので注意が必要です。Deployment は、デバッ グ情報が出力されませんのでデバッガが利用できません。

変更は、プロジェクトウィンドウの左にある [ Groups & Files ] のすぐ下にあるプロジェクト名と同じアイ コンを コントロールキー + クリック して [ Get Info ] メニューを選択します。[ Info ウィンドウ > Styles タ ブ ] をクリックして、 [ Active Build Style : ] の右から使用したいビルドスタイルを選びます。

(26)

17. バージョン番号を変更する

● Targets の Info ウィンドウの Version を使う

About パネルの括弧内のバージョンを変更するには、Targets 内のターゲットを選択し、コンテキストメニ ューの [ Get Info ] を選択します。ターゲットの [ Info ウィンドウ ] が表示されたら、[ Properties タブ ] を 選択します。ここに表示される [ Version ] を変えます。Resources > Info.plist ファイルの CFBundleVersion を直接編集しても同じです。

<key>CFBundleVersion</key> <string>1.0</string>

● InfoPlist.strings の CFBundleGetInfoString を使う

Resources > InfoPlist.strings ファイルの CFBundleGetInfoString を変えると、Finder 上で表示される バージョン表示が変わります。ローカライズして複数言語に対応している場合は、全言語のファイルを変更す る必要があります。

(27)

27

-18. アバウトパネルをカスタマイズ

● Credits.xxx を使う

Mac OS X 10.1.0∼ アバウトパネルをカスタマイズするには、Resouces グループの下に Credits.html ( HTML ファイル ) か、 Credits.rtf ( リッチテキストファイル ) か、Credits.rtfd ( 画像などが貼られているリッチテキストファイル ) を 登録します。HTML でリンクを貼れば、サポートページへのリンクになりますし、「 mailto : 」を使えばメー ラーを起動させることも可能です。 検索用キーワード:アバウトパネルにリンクを貼る、アバウトパネルにメールアドレスを表示

(28)

2.

文字列

19. 数値を文字列に変換する

● + [ NSString stringWithFormat : ] を使う

Mac OS X 10.0.0∼ 数値を文字列に変換するには [ NSString stringWithFormat : ] を使います。書式が指定できるので、様々 な形式の文字列を生成できます。 SAMPLE : 整数値を文字列に変換

NSString* str = [ NSString stringWithFormat : @"%d", 123 ];

SAMPLE : 浮動小数値を文字列に変換

NSString* str = [ NSString stringWithFormat : @"%f", 12.3 ];

(29)

29

-20. 文字列を数値に変換する

● - [ NSString intValue ] を使う

Mac OS X 10.0.0∼ 文字列を整数値に変換するには、 [ nsstring intValue ] を使います。 (SAMPLE) 文字列を整数値に変換 int i = [ @"123" intValue ];

● - [ NSString floatValue ] を使う

Mac OS X 10.0.0∼ 文字列を浮動小数値に変換するには、 [ nsstring floatValue ] を使います。 (SAMPLE) 文字列を浮動小数値に変換 float f = [ @"123.4" floatValue ];

● - [ NSString doubleValue ] を使う

Mac OS X 10.0.0∼ 文字列を倍精度浮動小数値に変換するには、 [ nsstring doubleValue ] を使います。 (SAMPLE) 文字列を倍精度浮動小数値に変換 double d = [ @"123.456" doubleValue ];

(30)

21. スペースで区切られた文字列を分解する

● - [ NSString componentsSeparatedByString : ] を使う

"Tokyo Nagoya Osaka" のように、項目をスペースで区切られた文字列を分解して、項目の配列を作成する には、 - [ NSString componentsSeparatedByString : ] を使います。

(SAMPLE) NSTextFieldに省略表示の機能を追加する(ソース部)

NSArray* array = [ @"Tokyo Nagoya Osaka" componentsSeparatedByString : @" " ];

このコードを実行すると、"Tokyo", "Nagoya", "Osaka" という 3 つの文字列の入った配列が array に代入さ れます。componentsSeparatedByString : の引数には、2 文字以上の文字列を指定することも出来ますが、 スペースとコンマをデリミタ ( 区切り文字 ) とするような指定は出来ません。

(31)

31

-22. ローカライズされた文字列リソースを読み込む

● NSLocalizedString を使う

ローカライズされた文字列を読み込むには、Localizable.strings というファイルを Resouces グループの下 に追加してローカライズした状態で、NSLocalizedString( ) を使います。1 つ目の引数には読み込みたい文字 列のラベルを書きます。

NSString* str = NSLocalizedString( @"WRITE_ERROR", nil ) );

● NSLocalizedStringFromTable を使う

ソフトウェアの規模が大きくなってきた場合、モジュール毎に文字列リソースを分けたくなります。その場 合は、各モジュール毎に「 MyModule.strings 」というファイル ( MyModule は任意の文字列 ) を作って Resouces グループに追加し、ローカライズして、NSLocalizedStringFromTable( ) を使います。1 つ目の引 数には読み込みたい文字列のラベルを書きます。2 つ目の引数にはファイル名を書きます。

(32)

23. NSTextField で文字列の省略表示を行う

● NSAttributedString の setLineBreakMode を使う

NSTextField には、セットされた文字列が長くて表示する幅が足りない時に「とても長い長...い文字列」の ように途中を「 ... 」で表示する機能は備わっていません。ただし、修飾つき文字列の NSAttributedString に は、この省略表記の機能がありますので、これを使って省略表示を行います。 (SAMPLE) NSTextFieldに省略表示の機能を追加する(ソース部)

@implementation NSTextField (CETextField)

- (void) setTrancatedStringValue : (NSString *) asString

trancatePosition : (NSLineBreakMode) aBreakPosition {

[ [ self cell ] setWraps : YES ]; // 表示のモードをラップありにする

// 省略形のパラグラフスタイルを作成

NSMutableParagraphStyle* style = [ [ NSParagraphStyle

defaultParagraphStyle ] mutableCopy ]; [ style setLineBreakMode : aBreakPosition ];

// パラグラフスタイルを文字修飾辞書にセット

NSDictionary* attributes = [ NSDictionary dictionaryWithObjectsAndKeys : style, NSParagraphStyleAttributeName, nil ]; // 修飾文字列を作成

NSAttributedString* str = [ [ [ NSAttributedString alloc ] initWithString : asString

attributes : attributes ] autorelease ]; [ self setAttributedStringValue : str ];

}

@end

(33)

33

-(SAMPLE) NSTextFieldに省略表示の機能を追加する(ヘッダー部)

@interface NSTextField (CETextField)

- (void) setTrancatedStringValue : (NSString *) asString trancatePosition : (NSLineBreakMode) aBreakPosition;

@end

これを以下のように使用します。

(SAMPLE) NSTextFieldの省略表示の機能を使用する ( 中央省略で表示する )

[ nstextfield setTrancatedStringValue : @"LONG LONG LONG STRING" trancatePosition : NSLineBreakByTruncatingMiddle ]; trancatePosition に与える引数は、NSLineBreakMode 型で以下のものがあります。 NSLineBreakByTruncatingHead : 先頭を省略「 ...長い文字列 」 NSLineBreakByTruncatingMiddle : 中央を省略「 長い...文字列 」 NSLineBreakByTruncatingTail : 末尾を省略「 長い長い文... 」 検索用キーワード:文字列の省略表示、文字列の省略表記、文字列を...を使って省略、エリプシス

(34)

3.

日時

24. 現在の日時を取得 NSDate

● + [ NSDate date ] を使う

現在の日時を取得するには、+ [ NSDate date ] を使います。

(SAMPLE) 現在の日時を取得する NSDate NSDate* now = [ NSDate date ];

NSDate : 現在の日時を取得 書式  + (id) date 出力  返り値 : 現在の日時を表すインスタンス。

● + [ NSCalendar calendarDate ] を使う

現在の日時を取得するには、+ [ NSCalendar calendarDate ] を使います。 (SAMPLE) 現在の日時を取得する NSCalendarDate

(35)

35 -NSDate : 現在の日時を取得 書式  + (id) calendarDate 出力  返り値 : 現在の日時を表すインスタンス。

(36)

25. 特定の月の日数を取得 / 閏年の判定

● - [ NSDate dateByAddingYears : months : days : hours : minutes :

seconds : ] を使う

カレンダー表示するときなど、特定の月が何日まであるかを取得したいことがあります。NSCalendarDate の計算を行うメソッドである - [ NSDate dateByAddingYears : months : days : hours : minutes : seconds : ] を使うと簡単に計算できます。2 月の日数を計算するようにすれば、閏年かどうかの判定も可能で す。

(SAMPLE) 指定の月の日数を取得

int aiMonth = 2000; int aiYear = 2;

NSCalendarDate* topDay = [ [ [ NSCalendarDate alloc ] initWithYear : aiYear month : aiMonth day : 1 hour : 0 minute : 0 second : 0

timeZone : nil ] autorelease ]; // 指定月の1日を取得

NSCalendarDate* endDay = [ topDay dateByAddingYears : 0

months : 1 // 1ヶ月進めて days : -1 // 1日戻す hours : 0 minutes : 0 seconds : 0 ]; // 来月1日を取得 検索用キーワード:うるう年判定、何日まであるか

(37)

37

-26. 指定時間スリープする

● + [ NSThread sleepUntilDate : ] を使う

現在のスレッドを一定時間スリープさせるには、+ [ NSThread sleepUntilDate : ] を使います。引数は秒 数ではなく、スリープ完了時刻であることに注意しましょう。 NSThread : 現在のスレッドを指定時刻までスリープさせる 書式

 + (void) sleepUntilDate : (NSDate *) aDate 入力

 aDate : スリープ完了時刻。

1 秒間スリープしたいというような場合は、+ [ NSDate dateWithTimeIntervalSinceNow : ] と組み合わせ ます。このメソッドは現在から n 秒後の NSDate を返すものです。秒数の指定は実数 ( float ) です。

(SAMPLE) 1秒間スリープする

(38)

4.

アプリケーション

27. アプリケーション自身のインスタンスを取得

● NSApp を使う

Cocoa アプリケーションで、アプリケーション自身 ( NSApplication ) のインスタンスを取得するには、 NSApp を使います。NSApp は、Cocoa のフレームワーク自身のグローバル変数ですので、どこからでも参 照ができます。

(SAMPLE) アプリケーションのインスタンスを取得 NSApp

NSApplication* app = NSApp;

● + [ NSApplication sharedApplication ] を使う

+ [ NSApplication sharedApplication ] を使っても取得が可能です。

(SAMPLE) アプリケーションのインスタンスを取得 NSApplication

(39)

39

-28. アプリケーション自身のフルパスを取得

● [ [ NSBundle mainBundle ] bundlePath ] を使う

アプリケーション自身のフルパスを取得するには、NSBundle を使います。Cocoa アプリケーションは、フ ォルダをファイルのように見せるバンドルで実現されていますが、そのバンドル自身を mainBundle で取得し て、bundlePath でパス文字列を取得します。

(SAMPLE) アプリケーション自身のフルパスを取得

NSString* appPath = [ [ NSBundle mainBundle ] bundlePath ];

(実行結果) /Applications/CocoaNote.appにアプリケーションがある場合

appPath <- @"/Applications/CocoaNote.app"

(40)

29. リソースファイル格納フォルダのフルパスを取得する

● [ [ NSBundle mainBundle ] resourcePath ] を使う

アプリケーション自身の中にあるリソース格納フォルダを取得するには、[ [ NSBundle mainBundle ] resourcePath ] を使います。

(SAMPLE) リソース格納フォルダのフルパスを取得する

NSString* path = [ [ NSBundle mainBundle ] resourcePath ];

(実行結果) /Applications/CocoaNote.appにアプリケーションがある場合

(41)

41

-30. リソースファイル格納フォルダ内のファイルのフルパスを取得する

● [ [ NSBundle mainBundle ] pathForResource: ofType: inDirectory ] を使う

アプリケーションの中にあるリソースファイルのフルパスを取得するには、[ [ NSBundle mainBundle ] pathForResource : ofType : inDirectory : ] を使います。

(SAMPLE) リソース格納フォルダのフルパスを取得する

NSBundle* bundle = [ NSBundle mainBundle ];

NSString* path = [ bundle pathForResource : @"Kero" // ファイル名

ofType : @"png" // 拡張子

inDirectory : @"" ]; // サブフォルダ名

inDirectory : のパラメータは、Resources フォルダの下にさらにフォルダを作成している場合に指定します。 なお、- [ NSBundle pathForResource : ofType : inDirectory : ] メソッドは、リソースがローカライズされ ている場合、カレントの言語のリソースを探します。 (実行結果) /Applications/CocoaNote.appのアプリケーションで、リソースがローカライズされて いない場合 path <- @"/Applications/CocoaNote.app/Contents/Resources/Kero.png" (実行結果) /Applications/CocoaNote.appのアプリケーションで、リソースがローカライズされて いる場合 path <-@"/Applications/CocoaNote.app/Contents/Resources/Japanese.lproj/Kero.png" 検索用キーワード:リソースファイルのパスを取得、リソースファイルのフルパスを取得

(42)

31. 実行ファイルのフルパスを取得する

● [ [ NSBundle mainBundle ] executablePath ] を使う

ア プ リ ケ ー シ ョ ン 自 身 の 中 に あ る 実 行 フ ァ イ ル を 取 得 す る に は 、 [ [ NSBundle mainBundle ] executablePath ] を使います。

(SAMPLE) アプリケーション内の実行ファイルのフルパスを取得する

NSString* path = [ [ NSBundle mainBundle ] executablePath ] );

(実行結果) /Applications/CocoaNote.appにアプリケーションがある場合

(43)

43

-32. アプリケーション名からフルパスを取得

● - [ NSWorkspace fullPathForApplication ] を使う

アプリケーションの名前から、そのファイルのパスを知るには、 - [ NSWorkspace fullPathForApplication ] を使います。 (SAMPLE) iTunesのフルパスを取得する

NSString* appPath = [ [ NSWorkspace sharedWorkspace ]

fullPathForApplication : @"iTunes" ];

(44)

33. アプリケーションをアクティブにする

● - [ NSApplication activateIgnoringOtherApps : YES ] を使う

アプリケーション自身をアクティブな状態にするには、 - [ NSApplication activateIgnoringOtherApps : YES ] を使います。

(SAMPLE) アプリケーションをアクティブにする

[ NSApp activateIgnoringOtherApps : YES ];

補足:一般に、勝手にアプリケーションがアクティブになると、ユーザ操作を妨げることになります。例え ば、テキスト入力中やメニュー選択中に、他のアプリケーションがアクティブになるとユーザの邪魔をするこ とになります。インアクティブなアプリケーションがユーザに何か知らせたい場合は、Dock のアプリケーシ ョンアイコンをジャンプさせるのが推奨される方法です。ただし、Dock のメニューを選んだときに環境設定 ウィンドウを表示させるなどの場合、ウィンドウを開いてもアプリケーションがインアクティブなままだと他 のウィンドウに隠れてしまうことがありますので、この場合はアクティブにしたほうがよいでしょう。 検索用キーワード:アプリケーションを前面に移動、アプリケーションをアクティブ化

(45)

45

-34. アプリケーションの終了時の処理

● applicationWillTerminate : を使う

ア プ リ ケ ー シ ョ ン 終 了 時 に 何 か 処 理 を し た い 場 合 は 、 ア プ リ ケ ー シ ョ ン の デ リ ゲ ー ト に applicationWillTerminate : というメソッドを記述しておくと、終了時に呼ばれます。 (SAMPLE) アプリケーション終了時の処理

- (void) applicationWillTerminate : (NSNotification *) aNotification {

// アプリケーション終了時の処理 }

(46)

35. アプリケーションの終了をキャンセルする

● applicationShouldTerminate : を使う

アプリケーションの終了がユーザによって選択されたときに終了できない状況の場合には、アプリケーショ ンのデリゲートに applicationShouldTerminate : を書き、返り値に NSTerminateCancel を返すことでキャ ンセルすることが出来ます。 (SAMPLE) 忙しいときは終了をキャンセルする ( bBusyはどこかに宣言されているBOOLの変数 )

- (NSApplicationTerminateReply) applicationShouldTerminate : (NSApplication *) aNote

{

if ( bBusy == YES ) return( NSTerminateCancel ); // 終了できません

return( NSTerminateNow ); // 今すぐ終了可能

}

applicationShouldTerminate : は、アプリケーション終了時に、アプリケーションを終了してよいかを問い 合わせるメソッドです。返り値として、NSTerminateNow を返すと、次に applicationWillTerminate : が呼 ばれて終了します。NSTerminateCancel を返すと終了しません。下図は、終了できる場合の流れです。

(47)

47

-36. アプリケーションの終了確認を行う

● applicationShouldTerminate : を使う

アプリケーションの終了がユーザによって選択されたときに終了できない状況の場合には、アプリケーショ ンのデリゲートに applicationShouldTerminate : を書き、返り値に NSTerminateCancel を返すことでキャ ンセルすることが出来ます。 アプリケーション終了確認 - (NSApplicationTerminateReply) applicationShouldTerminate : (NSApplication *) aApp {

if ( NSRunAlertPanel( @"Quit?", @"Select Button", @"Quit", @"Cancel", nil ) ==

NSAlertDefaultReturn ) return( NSTerminateNow ); // Quitボタン

return( NSTerminateCancel ); // Cancelボタン

(48)

37. アプリケーションの終了を延期する

● applicationShouldTerminate : を使う

アプリケーションの終了がユーザによって選択されたときに終了できない状況の場合には、アプリケーショ ンのデリゲートに applicationShouldTerminate : を書き、返り値に NSTerminateLater を返すことで延期す ることが出来ます。 (SAMPLE) 忙しいときは終了を延期する ( bBusyはどこかに宣言されているBOOLの変数 )

- (NSApplicationTerminateReply) applicationShouldTerminate : (NSApplication *) aNote

{

if ( bBusy == YES ) return( NSTerminateLater ); // 終了を延期

return( NSTerminateNow ); // 今すぐ終了可能

}

終了できるようになったら、[ NSApp replyToApplicationShouldTerminate : YES ] を呼びます。延期し たけど、やっぱり終了できないことになった場合は NO を引数に渡します。

(49)

49 -下図は、延期した後に終了可能になった場合の流れです。

(50)

38. 最後のウィンドウが閉じられたら終了する

● applicationShouldTerminateAfterLastWindowClosed : を使う

アプリケーションの最後のウィンドウが閉じられたときに自動的に終了させるようにするには、アプリケー ッションのデリゲートに applicationShouldTerminateAfterLastWindowClosed : メソッドを実装して、YES を返すようにします。 SAMPLE : 最後のウィンドウが閉じられたときに終了する - (BOOL) applicationShouldTerminateAfterLastWindowClosed : (NSApplication *) theApplication { return( YES ); }

(51)

51

-39. ドックのアプリケーションアイコンを変える

● [ NSApplication setApplicationIconImage : ] を使う

ドックのアイコンを変更するには、- [ NSApplication setApplicationIconImage : ] メソッドを使用します。

SAMPLE : リソースから画像を読み込んでドックのアイコンを変更する

NSImage* imgNoteIcon = [ NSImage imageNamed : @"NoteIcon" ]; [ NSApp setApplicationIconImage : imgNoteIcon ];

(52)

40. ドックのアイコンをジャンプさせる

● - [ NSApplication requestUserAttention : ] を使う

ドック内のアプリケーションアイコンをジャンプさせてユーザに通知を行うためには、- [ NSApplication requestUserAttention : ] を使います。

SAMPLE : ドックをクリックするまで繰り返しアイコンをジャンプさせる

int iReqNo = [ NSApp requestUserAttention : NSCriticalRequest ];

通知の種類には、一度だけジャンプするものと繰り返しジャンプするものの 2 種類がありますので、引数で 使い分けます。 NSRequestUserAttentionType: ドックによる通知の種類 enum { NSInformationalRequest = 0, // 一度だけジャンプ NSCriticalRequest = 1 // 繰り返しジャンプ } NSRequestUserAttentionType; NSApplication : ドックによる通知を行う 書式

 - (int) requestUserAttention : (NSRequestUserAttentionType) reqType 入力

 reqType : 通知の種類 出力

 返り値 : 通知の識別番号 ( キャンセルするときに使用する )

(53)

53 -を記憶しておいて使います。

SAMPLE : 何かの処理の間のみドックのアイコンをジャンプさせる

int iReqNo = [ NSApp requestUserAttention : NSCriticalRequest ]; : 何か処理をする

[ NSApp cancelUserAttentionRequest : iReqNo ];

NSApplication : ドックによる通知を中止する

書式

 - (void) cancelUserAttentionRequest : (int) request 入力

(54)

41. 他のユーザでの同時起動を禁止する

● Info.plist > LSMultipleInstancesProhibited を使う

ファストユーザスイッチを使用することで、同時に複数のユーザで同じアプリケーションを起動して使うこ とが可能になりますが、通信を行うソフトウェアでは通信ポートが競合するなどの問題で同時起動をさせたく ないこともあります。この場合は、Info.plist に LSMultipleInstancesProhibited を true として追加します。

これを追加しておくと、Finder が同時起動を禁止してくれます。

他のユーザでの同時起動を禁止する

<key>LSMultipleInstancesProhibited</key> <string>true</string>

(55)

55

-42. アプリケーションを Dock に表示させない

● Info.plist > LSUIElement を使う

メニューバーにのみ存在するようなソフトの場合などで Dock にアイコンを表示させたくないアプリケーシ ョンを作成したい場合は、Info.plist に LSUIElement を 1 として追加します。 アプリケーションをDockに表示させない <key>LSUIElement</key> <string>1</string> 検索用キーワード:Dock に表示させない

(56)

43. 環境設定の初期値を設定する

● - [ NSUserDefaults registerDefaults : ] を使う

環境設定の値は環境設定ファイルに保存されますが、ソフトウェアの初回起動時などでファイルから設定値 が 取 得 で き な い 場 合 が あ り ま す 。 こ の 場 合 に 使 用 す る 環 境 設 定 値 の 初 期 値 を 決 め る た め に は 、 -[ NSUserDefaults registerDefaults : ] を使います。 (SAMPLE) 環境設定値を取得する

NSUserDefaults* ud = [ NSUserDefaults standardUserDefaults ]; // 環境設定を取得

// 環境設定の初期値を登録 [ ud registerDefaults :

[ NSDictionary dictionaryWithObjectsAndKeys :

@"http://", @"TARGET_URL", // チェックするURL

[ NSNumber numberWithInt : 60 ], @"UPDATE_INTERVAL", // 更新間隔

[ NSNumber numberWithBool : YES ], @"AUTO_UPDATE", // 自動更新

nil ] ];

// 環境設定のそれぞれの値を取得

NSString* sTargetUrl = [ ud objectForKey : @"TARGET_URL" ]; // オブジェクト int iInterval = [ ud integerForKey : @"UPDATE_INTERVAL" ]; // 整数 BOOL bAuto = [ ud boolForKey : @"AUTO_UPDATE" ]; // 論理値

registerDefaults : の引数には、設定値とその設定値へアクセスするためのキーのオブジェクトを含む辞書を 渡 し ま す 。環 境 設 定 値 を 取 り 出す メ ソ ッ ド を 呼 ん だと き に 、 そ の 値 が存 在 し な い 場 合 は 、代 わ り に 、 registerDefaults : でセットされた辞書の中から設定値を取り出します。

検索用キーワード:環境設定の初期値、環境設定のデフォルト値、プリファレンスの初期値、プリファレン スのデフォルト値

(57)

57

-44. NSColor を環境設定に保存する

● + [ NSArchiver archivedDataWithRootObject : ] を使う

NSColor のインスタンスは、そのままでは NSUserDefaults へは登録できませんので、+ [ NSArchiver archivedDataWithRootObject : ] を使って NSData に変換して登録します。

(SAMPLE) NSColorを環境設定に保存する ( 黒をTEXT_COLORというキーで保存 )

NSUserDefaults* ud = [ NSUserDefaults standardUserDefaults ];

NSData* dataColor = [ NSArchiver archivedDataWithRootObject : [ NSColor blackColor ] ]; // NSArchiverでNSDataにする

[ ud setObject : dataColor forKey : @"TEXT_COLOR" ]; [ ud synchronize ]; // ファイルへの書き出し

(58)

45. NSColor を環境設定から読み込む

● + [ NSUnarchiver unarchivedDataWithData : ] を使う

NSUserDefaults に NSData と し て 登 録 し た NSColor の イ ン ス タ ン ス は 、 + [ NSUnarchiver unarchivedObjectWithData : ] を使うことで取り出せます。

(SAMPLE) NSColorを環境設定から取り出す ( TEXT_COLORというキーで保存している場合 )

NSUserDefaults* ud = [ NSUserDefaults standardUserDefaults ];

NSData* datCol = [ ud objectForKey : @"TEXT_COLOR" ];

NSColor* color = [ NSUnarchiver unarchiveObjectWithData : datCol ];

(59)

59

-5.

ウィンドウ

46. ウィンドウの位置を保存/復帰する

● Auto Save を使う

Interface Builder 上でウィンドウを選択して、[ Info Window > Attributes ] の中にある [ Auto Save Name ] に文字列を入力します。アプリケーションの環境設定ファイルの中にこの文字列を使ってウィンドウ の位置情報が保存され、次回、画面にウィンドウを表示するときには、その場所に表示されるようになります。

環境設定のファイルの中に保存されますので、Auto Save Name には他の環境設定の値と重複しない文字列 を入力します。

検索用キーワード:ウィンドウの位置を保存、ウィンドウの位置を復帰

47. ウィンドウをセンタリングする

● - [ NSWindow center ] を使う

ウィンドウを画面の中央に表示したい場合、- [ NSWindow center ] を使います。ただし、上下方向には完 全にはセンタリングされず、中央よりもちょっと上なります。これは、Apple Human Interface Guidelines で推奨されている中央表示を行っているためだと思われます。

検索用キーワード:ウィンドウを画面中央に表示、ウィンドウを画面中央に移動、ウィンドウをセンターに 表示、ウィンドウをセンターに移動

(60)

48. ウィンドウをフェードイン/フェードアウトさせる

● - [ NSWindow setAlphaValue : ] を使う

Mac OS X 10.3.0∼ ウィンドウをフェードイン/アウトさせるには、- [ NSWindow setAlphaValue : ] を使ってウィンドウの 透明度を連続して変化させることで実現できます。 (SAMPLE) ウィンドウをフェードインさせる NSWindow* nswindow = ウィンドウのインスタンス; int i; for ( i = 0 ; i <= 10 ; i++ ) {

[ nswindow setAlphaValue : ( (float) i ) / 10 ]; // ウィンドウの透明度を変える [ NSThread sleepUntilDate : [ NSDate dateWithTimeIntervalSinceNow : 0.1 ]; }

(61)

61

-6.

アラート

49. アプリケーションモーダルアラートを表示する

● NSRunAlertPanel を使う

アプリケーションモーダルアラート ( アプリケーション内の他のウィンドウの操作を一切禁止するアラート ) を表示するには、NSRunAlertPanel を使います。 (SAMPLE) 保存確認アラートを表示する

int iRet = NSRunAlertPanel(

@"Do you save this document?", // このメインメッセージと @"Your changes will be lost.", // この補足メッセージと @"OK", @"Cancel", @"Do Not save" ); // このボタン群のアラートを表示

if ( iRet == NSAlertDefaultReturn ) { /* OKが押された */ } else if ( iRet == NSAlertAlternateReturn ) { /* Cancelが押された */ } else if ( iRet == NSAlertOtherReturn ) { /* Do Not Saveが押された */ }

補足:この API を呼ぶと、ユーザがいずれかのボタンをクリックしてアラートを閉じるまでの間 ( この API を呼んだスレッドは ) 他の処理を行うことができなくなります。例えば、NSTimer によるタイマーの処理も 行われません。

(62)

50. スレッドを止めない単体のアラートを表示する

● NSRunAlertPanel を使う

NSRunAlertPanel 等のシートを使わないアラートを表示する API は、呼ぶと、アラートが閉じられるまで 処理が戻ってこないため、タイマー ( NSTimer ) を使った処理などが同時に動かなくなります。シートタイプ のアラートを表示する API で親のウィンドウを指定しないと、単独のアラートとして表示されます。API の使 い方はシートアラートと同じです。 (SAMPLE) スレッドを止めない単体のアラートを表示する NSBeginInformationalAlertSheet( @"Error is ocurred.", // タイトルはこれにする @"OK", nil, nil, // ボタンは、"OK"のみ

nil, // 親ウィンドウはなし ★ ここがポイント nil, // デリゲートもなし

NULL, NULL, // アラートを閉じるときのメソッドもなし @"Check your machine.", nil // 説明文はこれで

);

ボタンが 1 つしかないアラートの場合は、アラートを閉じるときに呼ばれるメソッドも指定は不要ですが、 複数個のボタンがある場合は、メソッドの指定は必須になります。

(63)

63

-51. シートアラートを表示する

● NSBeginAlertSheet( ) を使う

ウ ィ ン ド ウ の タ イ ト ル に 張 り 付 い て 表 示 さ れ る シ ー ト タ イ プ の ア ラ ー ト を 表 示 す る に は 、 NSBeginAlertSheet( ) を使います。この関数は、シートを表示するだけですぐに制御が戻ってきます。そのた め、アラート内のボタンがクリックされたときにコールバックされるデリゲートとそのメソッドを指定するこ とができます。 (SAMPLE) シートアラートを表示する NSBeginAlertSheet( @"TITLE", // アラートのタイトル @"OK", @"Cancel", nil, // ボタンのタイトル windowParent, // 親のウィンドウ self, // デリゲート

@selector( altDidEnd: returnCode : contextInfo : ), // 閉じる直前に呼ぶメソッド

@selector( altDidDismiss: returnCode: contextInfo: ), // 閉じた直後に呼ぶメソッド nil, // コンテキスト情報 @"MES_NO_PROJECTOR", nil // アラートのメッセージ ); コールバックされるメソッドは 2 つあります。シートが閉じる直前に呼ばれるものと、シートが閉じた直後 に呼ばれるものです。 (SAMPLE) シート終了時のコールバック // シートが閉じる直前に呼ばれる

- (void) alertDidEnd : (NSWindow *) sheet // このアラートが閉じようとしています returnCode : (int ) returnCode // クリックされたボタンはこれです contextInfo : (void *) contextInfo // コンテキスト情報はこれです {

NSLog( @"alertNoServerDidEnd" ); }

(64)

// シートが閉じた直後に呼ばれる

- (void) alertDidDismiss : (NSWindow *) sheet // このアラートが閉じました returnCode : (int ) returnCode // クリックされたボタンはこれです contextInfo : (void *) contextInfo // コンテキスト情報はこれです { if ( returnCode == NSAlertDefaultReturn ) { // リトライ } } アラート内にボタンが 1 つしかなく、アラートが閉じたときに何もする必要がない場合は、コールバックが 必要ないので、デリゲートを nil、メソッドを NULL にします。こうするとコールバックされませんので、呼び っぱなしにできます。 (SAMPLE) 情報を表示するだけのシートアラートを表示する NSBeginAlertSheet( @"TITLE", // アラートのタイトル @"OK", nil, nil, // ボタンのタイトル windowParent, // 親のウィンドウ nil, NULL, NULL, // デリゲートとメソッド nil, // コンテキスト情報 @"MES_NO_PROJECTOR", nil // アラートのメッセージ );

(65)

65

-7.

イベント

52. 現在のマウスカーソルの位置を取得する

● + [ NSEvent mouseLocation ] を使う

現在のマウスカーソルの位置を取得するには、+ [ NSEvent mouseLocation ] を使います。 (SAMPLE) 現在のマウスカーソルの位置を取得する

NSPoint ptMouse = [ NSEvent mouseLocation ];

NSEvent : 現在のマウスカーソルの位置を取得する 書式  + (NSPoint) mouseLocation 出力  返り値 : 画面上のマウスカーソルの位置 検索用キーワード:現在のマウスポインタの位置を取得する

(66)

53. 現在のマウスカーソルの可視状態を取得する

● 方法は用意されていない

Mac OS X 10.0.0∼Mac OS X 10.3.8

現在のマウスカーソル可視状態を取得する方法は用意されていません。

(67)

67

-54. 現在のモディファイキーの状態を取得する

● GetCurrentKeyModifiers( ) を使う

GetCurrentKeyModifiers( ) を使うと、直接現在のモディファイキーの状態を取得することができます。

(SAMPLE) コマンドキーとシフトキーが押されていることを判断

UInt32 iModKey = GetCurrentKeyModifiers();

if ( ( iModKey & cmdKey ) && ( iModKey & shiftKey ) ) { // コマンドキーとシフトキーが押されているときの処理

}

現在のモディファイキーの状態を取得する

書式

 UInt32 GetCurrentKeyModifiers( void ) 出力

 返り値 : 各モディファイキーの状態の値の論理和 ( OR )。

この関数の返り値は、各モディファイキーの状態がビットアサインされた値になっています。そのため、取 得した値と各モディファイキーのビットを取り出す定数と論理積 ( AND ) を取って状態を取得します。

(68)

モディファイキーのビットアサインを定義している定数は以下のようになっています。 HIToolbox > Events.h : モディファイキーのビットアサイン値 cmdKey = 256; // コマンドキー shiftKey = 512; // シフトキー alphaLock = 1024; // キャップスロックキー optionKey = 2048; // オプションキー controlKey = 4096; // コントロールキー 検索用キーワード:シフトキーの状態を取得する、オプションキーの状態を取得する、コマンドキーの状態 を取得する、コントロールキーの状態を取得する、キャップスロックの状態を取得する。

(69)

69

-55. ボタンの長押しを処理する

● - [ NSApplication nextMatchingMask : untilDate : inMode : dequeue : ] を

使う

ボタンがクリックされたときと長押しされたときで処理を変えたい場合は、mouseDown : メソッドの中で、 - [ NSApplication nextMatchingMask : untilDate : inMode : dequeue : ] で呼んで、マウスアップされたか どうかを判定します。

サンプルでは、CEButton という NSButton のサブクラスを作って、mouseDown : メソッドをオーバーラ イドしています。

SAMPLE : CEButtonのヘッダ

@interface CEButton : NSButton { }

@end

SAMPLE : CEButtonのヘッダ

@implementation CEButton

- (void) mouseDown : (NSEvent *) theEvent {

NSEvent *ev;

[ [ self cell ] setHighlighted : YES ]; // ハイライト表示

ev = [ NSApp nextEventMatchingMask : NSLeftMouseUpMask

untilDate : [ NSDate dateWithTimeIntervalSinceNow : 0.5 ] inMode : NSEventTrackingRunLoopMode

dequeue : YES ]; // 0.5秒間マウスアップを待つ

if ( [ ev type ] == NSLeftMouseUp ) { // マウスアップしていたらクリック

NSLog( @"Clicked" ); }

(70)

else { // マウスアップしていなかったら押しっぱなし

NSLog( @"Pressed" );

ev = [ NSApp nextEventMatchingMask : NSLeftMouseUpMask untilDate : [ NSDate distantFuture ] inMode : NSEventTrackingRunLoopMode dequeue : YES ]; // マウスアップを永久に待つ

}

[ [ self cell ] setHighlighted : NO ]; // ハイライト解除

}

(71)

71

-8.

メニュー

56. メニューアイテムの使用可/不可を制御する

● validateMenuItem : を使う

メニューアイテムが使用可能かどうかの制御を行うには、そのメニューアイテムのアクションメソッドを実 装しているインスタンス ( つまりターゲット ) に、validateMenuItem : メソッドを実装します。メニューをプ ルダウンする直前などに呼ばれます。引数には、メニューアイテム ( NSMenuItem ) のインスタンスが渡って きますので、返り値として YES を返すと使用可能になり、NO を返すと使用不可になります。 (SAMPLE) メニューアイテムの使用可/不可を制御する

BOOL gbIsDownloading = NO; // ダウンロード中ならYES

- (BOOL) validateMenuItem : (NSMenuItem *) anItem {

SEL menuAction = [ anItem action ]; // メニューアイテムのアクションを取得

if ( menuAction == @selector( startDownload : ) ) { // アイテムを判別 return( !gbIsDownloading );

}

else if ( menuAction == @selector( stopDownload : ) { return( gbIsDownloading ); } return( YES ); // 他のメニューは全て常に利用可能 } 引数で渡ってきたメニューアイテムのアクションを action メソッドで取得して、どのメニューアイテムか を判別します。title メソッドを使用してアイテムを判別する方法は、複数の言語をサポートすることを考慮す ると、言語によって文字列が変わりますので action で行うのが好ましいといえます。

(72)

補足 1:これは、メニューバーのメニューアイテムだけでなく、NSPopupButton のメニューや Dock の メニューも同様です。

補足 2:validateMenuItem : メソッドは、NSMenuValidation というプロトコルのものです。

(73)

73

-57. メニューバーを隠す

● + [ NSMenu setMenubarVisible : ] を使う

動 画 再 生 や ス ラ イ ド シ ョ ー / ゲ ー ム な ど で メ ニ ュ ー を 消 し た い 場 合 が あ り ま す が 、 + [ NSMenu setMenuBarVisible : ] を使います。 SAMPLE : メニューバーを消す [ NSMenu setMenuBarVisible : NO ]; NSMenu : メニューを隠したり表示したりする 書式

 + (void) setMenuBarVisible : (BOOL) visible 入力

 visible : YES - 表示する、NO - 隠す

NSMenu : メニュー表示状態を取得

書式

 + (BOOL) menuBarVisible 出力

(74)

9.

テーブル

58. NSTableView の基本制御

● データソースとデリゲートを使う

Mac OS X 10.0.0∼ NSTableView を使ってデータを表示する際、2 つのオブジェクトを用意します。1 つ目がデータソースとい って、NSTableView が表示するデータに関する情報 ( データの数や指定の位置のデータの中身 ) を要求してき ます。データソースのオブジェクトは、その情報を返答します。また、NSTableView でユーザがデータを編集 した場合は、その時も呼ばれます。2 つ目がデリゲートで、選択状態の変化等のユーザイベントやデータ表示 を行うときなどに呼ばれます。Interface Builder 上で NSTableView のアウトレットの dataSource と delegate に接続ができます。

(75)

75

-59. NSTableView にデータを表示する

● データソースを使う

Mac OS X 10.0.0∼ NSTableView のデータを表示するには、NSTableView のデータソースに 2 つのメソッドを実装する必要が あります。データの行数を返すための - [ <NSTableDataSource> numberOfRowsInTableView : ] と、指定 された場所のデータを返すための - [ <NSTableDataSource> tableView : objectValueForTableColumn : row : ] です。

SAMPLE : 辞書の配列 myArray をテーブルに表示する

// 指定のテーブルのデータの行数を返す

- (int) numberOfRowsInTableView : (NSTableView *) aTableView { return( [ myArray count ] );

}

// 指定のテーブルの指定のカラムの指定の行のデータを返す

- (id) tableView : (NSTableView *) aTableView objectValueForTableColumn : (NSTableColumn *) aTableColumn row : (int ) rowIndex {

NSDictionary* myDic = [ myArray objectAtIndex : rowIndex ]; return( [ myDic objectForKey : [ aTableColumn identifier ] ] );

} このサンプルでは、表示するためのデータを辞書の配列としています。つまり、テーブルの行方向を配列で 管理し、テーブルの各カラムを辞書で管理しています。NSTableView のカラムはユーザが並びを変更できるた め、左からのインデックスでは管理できず、各カラムに付けられている文字列の識別子を使います。カラムの 識別子は、 - [ NSTableColumn identifier ] で取得できます。 辞 書 は 、 デ ー タ を 引 き 出 す と き に 使 う キ ー を 文 字列 で 持 っ て い る こ と が 多 い で す が 、 こ の 文 字 列 を NSTableView のカラムの識別子として使うと、非常に相性がよく、サンプルのようにシンプルに書くことが出

(76)

参照

関連したドキュメント

線径 素線の直径を示します。 直径が細いほど、温度反応速度が速いものとなります。 直径が細いほど使用中に切断し易く なります。.

通常は、中型免許(中型免許( 8t 限定)を除く)、大型免許及び第 二種免許の適性はないとの見解を有しているので、これに該当す

不明点がある場合は、「質問」機能を使って買い手へ確認してください。

荒天の際に係留する場合は、1つのビットに 2 本(可能であれば 3

 医療的ケアが必要な子どもやそのきょうだいたちは、いろんな

利用している暖房機器について今冬の使用開始月と使用終了月(見込) 、今冬の使用日 数(見込)

* 広告や機能は条件によってはご利用いただけない場合があります。

   遠くに住んでいる、家に入られることに抵抗感があるなどの 療養中の子どもへの直接支援の難しさを、 IT という手段を使えば