最終更新:2009-04-10 (金) 03:15:39 (5496d)  

Xcode/チュートリアル
Top / Xcode / チュートリアル

簡単なアプリの作り方のメモ。(OSX 10.5向け)

とりあえずメモ帳っぽいのを作る。

基礎知識

  • バージョンによって細かい修正がされててXcodeInterface Builderの使い勝手が微妙に違う
    • 昔の本があまり参考にならない!
  • アプリを作る際の基本はMVCモデル

プロジェクト作成

  • ファイル→新規プロジェクト→Cocoa Application→適当に名前をつける

で、プロジェクトの雛形が作成される

作成されるファイル(プロジェクト名「hoge」の場合)

  • hoge.app
  • hoge_Prefix.pch
  • main.m
  • Info.plist
  • InfoPlist?.strings (English)
  • main.m
  • MainMenu?.xib (English)

GUIの作成 (View)

GUIの設定はXIBファイル (旧称:NIB)に対してInterface Builderで行う。

  • MainMenu.xib? (English)がデフォルトのXIBファイル。デフォルトだとEnglishになっているので日本語を追加
  • XcodeMainMenu.xib? (English)を右クリック→「情報を見る」を選択→「ローカリゼーションを追加」→「Japanese」を追加
  • アップルの指標では「最初に English 版の nib ファイルを作って、それをコピーして各言語用の nib ファイルを作りなさい」ということになっている

XcodeMainMenu.xib? (English)をダブルクリックするとInterface Builderが起動し、インスタンスウィンドウが表示される。(インスタンスウィンドウに表示されるのはGUIとコードを結びつけるために使うクラス群のインスタンスのアイコン)

インスタンスウィンドウに最初に表示されているもの

インスタンスウィンドウに表示されるアイコン(クラス)は、アプリケーションが起動されNIBファイルが読み込まれた時にインスタンスが生成される。

  • File's Owner - デフォルトではNSApplicationのインスタンス(アプリケーション終了の処理などを行う)
    • (複数ウィンドウ、複数メニューになる場合はFile's Owner !=Applicationになる)
  • First Responder - イベント通知を最初にを受け取るインスタンス。→レスポンダチェイン?
  • MainMenu? - デフォルトのメニュー (NSMenu?)
  • Application - NSApplicationのインスタンス
  • Font Manager - NSFontManager?
  • Window (Window) - NSWindow (メニューにくっついてくるWindow)

GUIのデザイン

  • パレットから適当にコントロールをウィンドウにドラッグして配置する
  • ソースコードから参照したいコントロール(NSTextFieldとか)にはアウトレット(IBOutlet)を、コードにイベントを通知したいコントロール(NSButtonとか)にはアクション(IBAction)を追加する

コントローラクラスの作成

  • Interface Builderで作成したGUIのコントローラを作成する
  • Xcodeで「ファイル」→「新規ファイル」→「Objective-C class」→「hogeController」 にする
    • hogeController.h (ヘッダ、宣言とか)
    • hogeController.m (実装)
  • の2つが作成される

hogeController.h

#import <Cocoa/Cocoa.h>
@interface hogeController : NSObject {
	//アウトレットを宣言
	IBOutlet NSTextView* textMemo;//NSTextViewに対するアウトレットtextMemoを宣言
	IBOutlet NSTextField* textFilePath;//NSTextFieldに対するアウトレットtextFilePathを宣言
}
//アクションを宣言(-はインスタンスメソッドの意味)
-(IBAction)saveText:(id)sender;//保存ボタンが押されたときのアクション
-(IBAction)loadText:(id)sender;//読み込みボタンを押したときのアクション
@end

hogeControlelr.m

#import "hogeController.h"

@implementation hogeController
-(IBAction)saveText:(id)sender{

	NSString* path=[textFilePath stringValue];//NSTextFieldの値を取得
	NSString* memo=[textMemo string];//NSTextViewの値を取得

	//""はCのリテラルchar*?になるが、@""はNSStringになる
	int choice = NSRunAlertPanel(path, memo, @"はい", @"いいえ", nil);
	 switch(choice){
		case NSAlertDefaultReturn:
			//保存
			[self saveToFile:path content:memo];
			break;
		case NSAlertAlternateReturn:
			break;
		case NSAlertOtherReturn:
			break;
	}	
}
//テキストを読み込む
-(IBAction)loadText:(id)sender{
	NSString* path=[textFilePath stringValue];
	NSError* error;	
	NSString* memo= [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
	[textMemo setString:memo];
}
//テキストを保存するObjective-Cの関数
-(void) saveToFile:(NSString*)path content:(NSString*)str{
	NSError* error;
	BOOL result;
	result=[str writeToFile:path atomically:true encoding:NSUTF8StringEncoding error:&error];	
}

@end

参考

  • Appleのドキュメント

関連