最終更新:2009-04-10 (金) 03:15:39 (5510d)
Xcode/チュートリアル
簡単なアプリの作り方のメモ。(OSX 10.5向け)
とりあえずメモ帳っぽいのを作る。
基礎知識
- バージョンによって細かい修正がされててXcodeとInterface Builderの使い勝手が微妙に違う
- 昔の本があまり参考にならない!
- アプリを作る際の基本はMVCモデル
プロジェクト作成
- Xcodeを起動
- ファイル→新規プロジェクト→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で行う。
- アップルの指標では「最初に English 版の nib ファイルを作って、それをコピーして各言語用の nib ファイルを作りなさい」ということになっている
XcodeでMainMenu.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のドキュメント