Labs

<< 最初 < 前ページ 次ページ > 最後 >>
icon 2010/05/11 Objective-C 基礎編 Vol6
タイトルが雑なので変更 さぁ、少しずつ実用的なサンプルに入ってきた。

■アクションシートデリゲート(UIActionSheetDelegate) アクションシート(UIActionSheet)は、2つ以上のアクションを選択して処理するためのクラス どれかを選択しないと次へ進めない、モーダルダイアログみたいなものですかね?
まず、UIActionSheetにDelegateするための宣言
@interface UntitledViewController : UIViewController<UIActionSheetDelegate>
 {
	IBOutlet UILabel *statusText;
	IBOutlet UITextField *nameField;
	IBOutlet UITextField *numberField;
}

■アクションシート実装
-(IBAction) buttonPressed:(id)sender {
	UIActionSheet *actionSheet = [[UIActionSheet alloc]
								  initWithTitle:@"Are You Sure?"
								  delegate: self 
								  cancelButtonTitle:@"No Way!" 
								  destructiveButtonTitle:@"Yes, I'm Sure" 
								  otherButtonTitles:nil
								  ];
	[actionSheet showInView:self.view];
	[actionSheet release];
}

・UIActionSheetオブジェクトを初期化
・initWithTitle:アクションシートのタイトル
・delegate:自分自身を受け渡す事で、後に関連メソッドを自動呼出
・cancelButtonTitle:キャンセルボタンラベル
・destructiveButtonTitle:OKボタンラベル
・otherButton:複数のボタンを追加できる(カンマ区切り)
・actionSheetのshowInViewを呼び出す
※self.viewがドットシンタックスなのは、viewがプライベートインスタンスだから


次にアクションシートが消えた時に通知する処理(actionSheet didDismissWithButtonIndex)
-(void) actionSheet:(UIActionSheet *)actionSheet 
didDismissWithButtonIndex:(NSInteger)buttonIndex {
	if (buttonIndex != [actionSheet cancelButtonIndex]) {
		NSString *msg = nil;
		if (nameField.text.length > 0) {
			msg = [[NSString alloc] 
				   initWithFormat:@"You can breathe easy, %@, evetything went OK.",
				   nameField.text];
				   
		} else {
			msg = @"You can breathe easy, everything went OK.";
		}
		
		UIAlertView *alert = [[UIAlertView alloc]
							  initWithTitle:@"Something was Done"
							  message:msg 
							  delegate:self 
							  cancelButtonTitle:@"Phew!" 
							  otherButtonTitles:nil
							  ];
		[alert show];
		[alert release];
		[msg release];
	}
}
UIActionSheetクラスのソースを見てみると、まんまインターフェイスで定義されていて、お約束のデリゲートメソッドらしいが、構文がイマイチ???
・ -(void) actionSheet:(UIActionSheet *) actionSheet = actionSheet(引数)
・didDismissWithButtonIndex:(NSInteger)buttonIndex = didDismissWithButtonIndex(引数)

として、Java風に言えばこんな感じなのか?
actionSheet(引数).didDismissWithButtonIndex(引数)
ちなみに、力技の確認方法ですが「(void) actionSheet」と「didDismissWithButtonIndex」 の名称を変更すると動作しません。
よって「actionSheet.didDismissWithButtonIndex」が自動的に呼ばれているということ。

メッセージメソッドからしても、
・「半角スペース = ドットシンタックスもしくは引数カンマ」
・「コロン = 引数()」
・「() = 型」

と考えれば、基本的にコード解読がしやすいと思われ。
ただ、1つ腑に落ちないのはこの書き方


(UIActionSheet *) actionSheet
このアスタリスクは何なの???と疑問に思っていたが、メソッドの引数型の決まりみたいね。

(返り値型)メソッド:(引数型 *)引数


前にも書いたけど、idだけは例外でアスタリスクはつけなくてもいい。
あとは「半角スペース」で繋げていく感じ。

うーん、メッソドの書き方は少しずつ見えてきたかな? 番外で、アクションシートについての実装の仕方がYoutubeにありました(^^)
iPhone SDK Knigge - 2.1 - UIActionSheetDelegate (Deutsch)






いやぁ、こういう風にするとわかりやすいね。 オイラもObjective-Cにマスターになれば、やってみたいけどw
icon 2010/05/10 Objective-C 基礎編 Vol4
音楽やってる時間がないとはいえ、今月は1本、来月は2本(?)演奏があったり。
結局、色々と思うようには進まず。。。

■アプリケーションデリゲート
OOP用語でいう「委譲」のGoFデザインパターンの1種
Facadeパターンと同じで、複数のクラスを1つにまとめた(見せかけ)て利用する。

Appleのドキュメントには、以下のように記載されている。

アプリケーションの上位レベルの動作を監視するのは、
デベロッパが提供するカスタムオブジェクトである、アプリケーションデリゲートオブジェクトの責任です。
デフォルトのUIApplicationオブジェクトなどの複雑なUIKitオブジェクトのサブクラス化を避けるために使用されるメカニズムです。



UIkitの面倒な処理を、一任できるようだ(という言い回しは曖昧だw)
#import <UIKit/UIKit.h>

@class UntitledViewController;

@interface UntitledAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    UntitledViewController *viewController;
}

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

@end
基本的にX-codeでプロジェクトを選ぶと自動生成してくれるので、
あまり意識するクラスではないかもしれないのかな?

ただ、アプリケーション固有の実装が必要になった時に、
本質を理解しておく必要はあるかも知れない。
今は、あまり深く追求せずに先へ進もうw

ちなみに、ソースのUIApplicationDelegateの上で、option + ダブルクリックすると「UIApplicationDelegate.h」のソースを見る事ができ、
iPhoneOSに特化した面倒くさい宣言が数々記述されている。

■InterfaceBuilderのショートカット
コマンド + 1 : Attributes
コマンド + 2 : Connections
コマンド + 3 : Size
コマンド + 4 : Identity

■RoundButtonのタッチイベント
ボタンクリックのイベントは、ボタン内で指を離す「Touch Up Inside」が基本。
これはiPhone特有かな?と思ったけど、考えてみればブラウザやその他アプリケーションも、「Click」ではなく「Click Up Inside」の動作をしている気がする。


icon 2010/05/05 Objective-C 基礎編 Vol3
実家では、仕事場(商売屋なので)に行かないとネット使えないけど、部屋の場所によっては、無線LANのフリースポットが微妙に入ったり。
なんで、電波入るピンポイントを探してネットしてます(^^;) さて、続き

■*(アスタリスク)
個人的にObjective-Cで違和感がある書き方に「*(アスタリスク)」がある。
いわゆるC言語でいうポインタ。

自分はC言語はちゃんとやったことないので、それが違和感の原因かもしれないw
Webのオブジェクト指向プログラムでは、無意識にポインタ(参照)コーディング しているからであろう。

NSString *インスタンス名 = [[NSString alloc] initWithFormat:@"%@ xxxxxxx", ];


・クラスオブジェクト型のインスタンス変数は、「*」を付けて宣言 ・id型の場合は、「*」なしで宣言可能

■アクセス修飾子
@private 
int test1;
int test2;
@protected 
int test3;
@public 
int test4; 
int test5; 

・アクセス修飾子private、protected、publicは「@」ディレクティブとして宣言
・Objective-Cのデフォルトはprotected
・次のディレクティブまたはリストの終わりまでの間に記述されたインスタン
ス変数に適用
・packageは64bitのみ


参考: Objective-C 2.0プログラミング言語:クラス実装
Objective-Cのアクセス制限とJavaのアクセス修飾子を比較してみる

これもちょっと違和感と言うか、パッとみわかりにくい気がする。
Java等はインスタンス変数の修飾子は1行で明示的にするのが作法なので、


@private int test1;
@private int test2;
@protected int test3;
@public int test4; 
@public int test5; 
あぁ、でも最初の方が合理的でいいのかな?(^^;)
あと、クラス自体のアクセス修飾子ってどうなんだろうか?
また機会がある時に調べないと。。。

■メッセージネスティング
これが、Objective-Cの「わかりにくさNo1」と個人的に思っていたり・・・。

NSString *インスタンス名 = [[NSString alloc] initWithFormat:@"%@ xxxxxxx", ];


これはよく出てくるコーディング。
alloc、init等は、新旧問わず暗黙的にネストして記述するようなので慣れるしかない。
--2010/07/17追記--
・alloc:メモリ確保
・init:初期化(NSObjectのメソッド)
メモリ管理によると、初期化のメッセージングを連続して書かないとnilを返す可能性があるとのこと。

オブジェクトを安全に初期化するには、割り当ておよび初期化メッセージを 1 行のコードに結合することが推奨されている。
------

ただ、以下のようにネストされるとやはり思考を停滞させられる。

[NSString stringWithFormat:@"%@ xxxxxxx", [sendertitleForState:UIControlStateNormal]];


個人的には「行数をただ減らせば良いってもんじゃない」と、「わかりやすさ重視派」なので。
(多分どの言語でもネストは悪だと思うんだけどねえ)

まぁ、コードって本当にその人の性格や思考回路が出ますねw
<< 最初 < 前ページ 次ページ > 最後 >>

このサイトについて

HTML5 & CSS3化しつつあるので、現在IEには対応してません。
できれば、Google Chromeやら Apple SafariのWebKit系をお勧めします。

DBからプログラムまで一応全て自作なので、バグってたらすいません。
実験でFlash版(Flex版)を先に作りましたが、ちょっと停止してます。

プロフィール

新宿近辺でSE & プログラマーしてます。
Webアプリの開発・設計とか、最近はiPhoneとか奮闘してます。
デザインはさっぱりです。

音楽は、昔からCubase打ち込み人間で、そっちの方が経歴は長いですが、最近はやる暇がないです。。。

今は、Gon's Privates ってバンドのキーボードやってます。
単発的に、なんちゃってジャズ系のライブもやってます。

名古屋生まれなのでドラゴンズ好きです。

Info && SNS

Gmail

 yohei.yoshikawa@gmail.com

Twitter

 http://twitter.com/yoo_yoo_yoo

あんまつぶやきませんが、一応技術系メインで使ってます。情報交換はこちらへ

FaceBook

 http://www.facebook.com/#!/profile.php?id=1439130626

海外の知り合いがいないので閑散としてます。

mixi

 http://mixi.jp/show_profile.pl?id=230072

音楽仲間とかはこっちメインでやってます。興味があればこちらへ