修正日: 07/10/19
練習問題11
解答編
では解答編です。なんだか難しそうなことをしそうな感じがしたかもしれませんが、実際のところはものすごく簡単です。まずはDockの表示をBMIの結果にあわせて切り替えるメソッドから。
- (void)setDockIcon
{
NSImage *anIcon;
if( bmi < kUnderweightMax )
anIcon = [NSImage imageNamed: @"blue.png"];
else if( bmi < kNormalWeightMax )
anIcon = [NSImage imageNamed: @"white.png"];
else if( bmi < kOverweightMax )
anIcon = [NSImage imageNamed: @"yellow.png"];
else
anIcon = [NSImage imageNamed: @"red.png"];
[NSApp setApplicationIconImage: anIcon];
}
計算結果のBMIの値を見て対応するイメージを取り出し、それを「setApplicationIconImage:」メソッドでセットしてあげるだけです。BMIの値の判定のところで「k○○」という単語を使っていますが、これはヘッダ「BMICalculator.h」の方で定義します。
#define kUnderweightMax 18
#define kNormalWeightMax 25
#define kOverweightMax 30
この#define命令については「C言語補習2」を参照してください。#defineしたのにあわせて「setValues」メソッドも少し書き換えました。
if(bmi < kUnderweightMax)
[alertField setStringValue: NSLocalizedString(@"too thin",@"") ];
else if(bmi>kNormalWeightMax)
[alertField setStringValue: NSLocalizedString(@"too fat",@"") ];
else
[alertField setStringValue: @""];
このように#defineを使うことで、例えば将来痩せ過ぎの基準値が18から19に変わったとしても、#defineで定義してある部分一カ所を変えるだけで済み、ソースコードの中の18を探しまわって変更する必要は無くなり便利です。
さて、あとは作った「setDockIcon」メソッドを適当なタイミングで呼び出してやればOKです。具体的には「setValues」で計算結果をウィンドウに表示した後にDockの表示を書き換えれば良いでしょう。
- (void)setValues
{
[bmiField setFloatValue:bmi];
[bmiSlider setFloatValue:bmi];
//略
else
[alertField setStringValue:@""];
[self setDockIcon];
}
これで完成です。そうそう、新しく作ったメソッド「setDockIcon」の定義をヘッダに追加するのも忘れないように。
完成品サンプルをこちらに置いておきます。
今回実装した機能は一見作るのに時間がかかりそうに思われるかもしれませんが、方法さえわかってしまえば後はすごく簡単だ、ということがわかっていただけたのではないかと思います。プログラムの基本構造というのは結局条件分岐と繰返しだけで、それ以外の大変な作業というのは、APIとしてOSから提供されている機能にどんなものがあるのか、どうやって使えば良いのかを調べることだったりします。最近はCocoaに関する日本語の情報も大分増えてきたのでそういうページをチェックしたり、英語のドキュメントを面倒くさがらずに読むことが、プログラミング上達の道だったりします。
次回はプログラムを書く上でとても重要な(ある意味一番重要で一番大変かもしれない)デバッグについて簡単に説明します。