2009/02/10

[Objective-C][iPhone sdk]文字列を画面に出力

iPhone sdkサイトにあるサンプルコードをアレンジして、やっと自由自在に画面に文字列を出力することができたので、自作テンプレートを公開しようかなと。
(前提条件として、Interface Builderを使わずコーディングし、プロジェクト名を「output_text.xcodeproj」とします。)

ただ、単純に文字列を出力するだけなので、テンプレートもくそもないのですが、すごくうれしかったので♪

プログラムの流れの順に公開
iPhone sdkは、main.mが最初に実行されるので、まずは、main.mから。
(おそらくこれは、アプリを開発する言語がCとObjective-Cで構成されているので、main.mからスタートすると考えられる。)

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

実際のところ何も変わっていません。

デフォルトの状態です。

次は、文字列を格納、出力位置、文字の色を格納するインターフェースset_text.hを実装
#import <UIKit/UIKit.h>

//UIViewを継承する
@interface set_text : UIView {
NSString *text;
CGPoint location;
UIFont *font;
UIColor *color;
}

@property (readwrite, retain) NSString *text;
@property (readwrite) CGPoint location;
@property (readwrite, retain) UIFont *font;
@property (readwrite, retain) UIColor *color;

@end

このset_textは、UIViewクラスを継承して、{}の中にある4つの変数を宣言しています。

と同時に、プロパティとして{}の後ろで宣言しています。

ちなみに、「readwrite」は、読み書き可能、「retain」は、iPhone sdkプログラミングには、「オブジェクトにretainメッセージを送る」と書かれていて納得できないのですが、英語で「保持する」と書いてあったので、入れました。

この場合、変数の情報を保持してくれないと困るので。

また、CGPointに入れていない理由ですが、最初入れたら、エラーか警告がでたので、はずしました。

ここで、Javaと大きく違うのは、同じクラスを作成するにしても、まず、「●●●.h」でだいたいの骨組みを作って次に紹介する、「set_text.m」で肉付けをします。

ちなみに上のインターフェースは、Javaのインターフェースとは、違い、Objective-Cの場合は、プロトコルという名前になります。

で、次に、肉となる「set_text.m」

#import "set_text.h"


@implementation set_text
@synthesize text;
@synthesize location;
@synthesize font;
@synthesize color;

- (id)initWithFrame:(CGRect)frame {

if (self = [super initWithFrame:frame]) {
// Initialization code
}
return self;
}

- (void)drawRect:(CGRect)rect {

//フォントの色を設定
[self.color set];

//テキストを設定した書式、場所で表示
[text drawAtPoint:location withFont:font];
}

- (void)dealloc {
[super dealloc];
}

@end

「set_text.h」で宣言したプロパティを使う場合、「@synthesize」が必要なので、忘れずに追加。

initWithFrameメソッドは、UIViewクラスを初期化するのに必要なので、このままにしておく。
(というか、このメソッドは、ファイルを作った時に既にあるので、その設定のままにしておいただけです。)

で、drawRectメソッドは、viewの所定の位置に、設定されたフォントの色と大きさで書き込むメソッドです。

deallocはメモリを解放します。

iPhone sdkはJavaのようなガベージコレクションがないので、手動で解放しなければなりません。

ガベージコレクションについては、schemeにもでてくるので、後々考察したいポイントです。

次に、今回のプロジェクトの名前がoutput_textなので、実行部である「output_textAppDelegate.h」を見てみます。
#import <UIKit/UIKit.h>

@interface output_textAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

ここもファイルを作った時から変更を加えていません。

で、最後に、「output_textAppDelegate.m」です。
#import "output_textAppDelegate.h"
#import "set_text.h"

@implementation output_textAppDelegate

@synthesize window;


- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Override point for customization after application launch
//文字列を作成するオブジェクトをコール
set_text *output_text = [[set_text alloc] initWithFrame:[window frame]];

//文字列をセット
output_text.text= @"ふぁいと〜一発、うふ";
//文字列を出力するポイントを設定
output_text.location = CGPointMake(10,200);

//フォントの大きさを設定
output_text.font = [UIFont systemFontOfSize:24];

output_text.color = [UIColor whiteColor];

//オブジェクト(window)をウィンドウに追加
[window addSubview:output_text];

//メモリの解放
[output_text release];

//ウィンドウの表示
[window makeKeyAndVisible];
}


- (void)dealloc {

[window release];
[super dealloc];
}


@end

上のapplicationDidFinishLaunchingは、アプリケーションを稼働する直前にコールされるメソッドで、初期設定を行うところです。

set_text型のオブジェクトを定義し、出力する文字列、位置、フォント、色を設定します。

文字列は、output_text型のtextメソッドで設定。
(いわゆる、setterです。)

位置は、CGPointMake関数で設定、第一引数は、x軸、第二引数は、y座標。

フォントは、UIFont型のsystemFontOfSizeメソッド、いわゆるクラスメソッドですね。

色もUIColor型のwhiteColorメソッドで、こちらもクラスメソッド。
でも、これだけだと、色の設定が完了しきれていなくて、最後に、setメソッドを呼ぶ必要があります。
(これは、set_text.mにあるself.color setで実現)

で、これでオールオッケーのように思いますが、実際これでビルドして実行しても何も表示されなくて、最後に、ウィンドウに貼付けるという作業が残っています。

それが、window型のaddSubviewメソッドです。

ビルド後の実行結果を貼付けておきます。

Photobucket

基本的には、再利用可能なので、是非、使ってみてください。

「バグがあるんですけどー」、「こっちの方がメモリーの効率がよくていいと思いますよー」など、意見がありましたら、ドシドシ、コメント、トラックバックなりでいただけると幸いです。

いつになく、こういった意見を求めている理由は、

1.組み込み系のアプリを作るのが初だから
2.オブジェクト指向の言語に真剣に取り組んだのが初だから
3.Objective-Cの仕様を完璧に把握してないから
4.iPhone sdkの仕様の理解度がまだまだ低いから

があります。

まだ、もうちょい今回のエントリーに関して書きたいことがあるのですが、さすがに長くなっていると思うので、いったん、閉じます。

0 コメント:

コメントを投稿