プログラムの作成
やっと。。。やっとプログラムの作成にこぎつけました。 このページも随分と前に作成したのに、ほったらかして。。。やっとひのめを見る事ができました。 さてさて、前置きはこれぐらいにしてコーディングを。。。 クラスから自動生成されたプログラムファイル( 作り方はこちら) を開いて見ると次のようなひな形が作られています。作られたファイルは2つです。
- ヘッダプログラム(hello.h)
- プログラム本体(hello.m)
/* hello */
#import <Cocoa/Cocoa.h>
@interface hello : NSObject
{
IBOutlet id toDay;
}
@end
#import <Cocoa/Cocoa.h>
@interface hello : NSObject
{
IBOutlet id toDay;
}
@end
「~.m」という拡張子がついている方はプログラム本体(hello.m)です。
#import "hello.h"
@implementation hello
@end
ヘッダプログラムとプログラム本体。2つに分かれているように見えますが
実は1本なんです???。
プログラムを実行する前にビルド(昔はコンパイルと呼ばれていたんですけど)という作業を行いますが、その時に1つになります。
プログラム本体に記述されたimport文の中にヘッダプログラムが挿入されます。@implementation hello
@end
それではヘッダプログラムから見ていきましょう!。ぱちぱちぱちぃ
ヘッダプログラムに記述されております次の1行は日付を出力するためのOutlet(ア ウトレット)になります。
IBOutlet id toDay;
アウトレットにはインスタンスへのポインタが入ります。
インスタンスという言葉が初めて出てきましたが、オブジェクト指向ではクラスから作成された実体、本体、メモリに展開されたプログラム。。。まぁいろんな
言い方があるんですが、実行可能なプログラム(メモリに展開されているプログラム)の事をインスタンスといいます。それではプログラミングに入りたいと思います。
今現在、そろっているプログラムは3つ。
- main.m
- hello.h
- hello.m
return NSApplicationMain(argc, argv);
これは何をやっているかといいますと、みなさんが画面を作成したnibファイルをプログラムに読み込んだ後
イベントループのプログラムを呼び出しています。
イベントループプログラムを呼び出しているということは、制御がMacOS側に移ってしまいます。
制御がMacOS側にうつってしまうと、なにかちょっかいを出すまでプログラムに制御を戻すことができません。
ちょっかいといわれても。。。
このプログラムボタンはないし、なにもちょっかいだせない。。。どうしよう。。。。
実はnibから作成した「hello」クラスにawakeFromNibと
いうメソッドを追加することによって、
nibファイル読み込み後そのメソッドが自動的に呼ばれるようになります。
hello.mに以下のメソッドを追加しましょう!。
// 一番最初に呼ばれるメソッド関数
- (void)awakeFromNib{
}
さてさて、本題にもどって。。。
- (void)awakeFromNib{
}
このプログラムは本日の日付を出力しようというものです。従って日付のクラスを使用します。 クラスの説明をた くさんして下さっているサイトにいってそれらしいものを探します。 日付だからDateで探せばオッケーかな〜なんて軽い気持ちで探してみたら。 ありましたありました。 NSCalendarDateこ れはまさしくそれっぽいですね。 NSCalendarDateクラスのcalendarDateメ ソッド。これがまさに現在の日付を返してくれるメソッドのようです。 ここに書いてあるサンプルのように記述するだけで現在の日付は取得できるようです。
NSDate *theDate;
theDate = [NSCalendarDate calendarDate];
このプログラムでは現在の日付を取り出すところまでは行っていますが、画面への出力は行っていません。
つまりこの日付をアウトレットにセットしてやればよいわけです。
アウトレットにセットするためのメソッド setObjectValue を使ってアウトレットにセットしてみましょ〜う
プログラムにすると次のようになります。
theDate = [NSCalendarDate calendarDate];
NSDate *theDate;
theDate = [NSCalendarDate calendarDate];
[toDay setObjectValue: theDate];
それでは今までのプログラムを整理すると次のようになります。まずmain.m
theDate = [NSCalendarDate calendarDate];
[toDay setObjectValue: theDate];
#import <Cocoa/Cocoa.h>
int main(int argc, const char *argv[])
{
return NSApplicationMain(argc, argv);
}
そしてhello.h
int main(int argc, const char *argv[])
{
return NSApplicationMain(argc, argv);
}
#import <Cocoa/Cocoa.h>
@interface hello : NSObject
{
IBOutlet id toDay;
}
@end
最後にhello.m@interface hello : NSObject
{
IBOutlet id toDay;
}
@end
@implementation hello
- (void) awakeFromNib
{
NSDate *theDate;
theDate = [NSCalendarDate calendarDate];
[toDay setObjectValue: theDate];
}
@end
さぁ!画面に日付は出力されたでしょうか?
殺虫剤ボタンをおしてみましょ〜〜〜!
- (void) awakeFromNib
{
NSDate *theDate;
theDate = [NSCalendarDate calendarDate];
[toDay setObjectValue: theDate];
}
@end

げげっ;途中できれている。。。。^^;
アウトレットの枠が小さかったようです。InterfaceBuilderで枠を大きくして下さ〜い。