Home > iPad > | iPhone > iPhone/iPad @protocolで自前のDelegate

iPhone/iPad @protocolで自前のDelegate

  • Posted by: goron
  • 2011年1月24日 21:00
  • iPad | iPhone

やっと、@protocolを自前で実装するやり方が分かったのでメモ。初歩的ですが。

今までというか、protocolを使う前は、初期化の時にdelegateととして呼び出し元のインスタンスを渡していました。
例えば、こんな感じ。

id delegate;(.hで変数宣言)
-(id)intWithDelegate:(id)del;

それでインスタンスを作成する時に

object *obj = [object alloc] initWithDelegate:self];

とやっておいて、呼び出し元へアクセスするときは、
performSelectorを使っていました。
[delegate performSelector:@selector(imgDidFinish:) withObject:data];

これでもいいとは思うのですが、スマートではないのかもしれません。

そこで、protocolを使ってみます
まず、ヘッダー。UIViewControllerクラスを使った場合。
UIImagePickerを使って画像選択して、トリミング終了後にdelegateで戻ってくるイメージです。
ImgSelectControllerというクラスの
-(void)imgDidFinish; (作業終了後に呼ばれる)と
-(void)imgSelectCancel; (作業キャンセル時に呼ばれる)
がdelegateメソッドになります。(今回関係ない変数、メソッドなどは省略しています)


#import <UIKit/UIKit.h>
@protocol ImgSelectControllerDelegate;
@interface ImgSelectController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
id <ImgSelectControllerDelegate> delegate;
}
@property (nonatomic, assign) id<ImgSelectControllerDelegate> delegate;
@end
@protocol ImgSelectControllerDelegate <NSObject>
@optional
-(void)imgDidFinish:(UIImage*)image;
-(void)imgSelectCancel;
@end

@interface前に@protocol ImgSelectControllerDelegate;を宣言して
変数 id <ImgSelectControllerDelegate> delegate; とプロパティの
@property (nonatomic, assign) id<ImgSelectControllerDelegate> delegate;
を宣言する、

後は、delegateメソッドを記入する。

.m ファイルの方では、@synthesize delegate; 追加しておく。


#import "ImgSelectController.h"
@implementation ImgSelectController
@synthesize delegate;
- (id)initWithID:(int)num media:(int)photo{
self = [super init];
if (self != nil ){
myID = num;
mediaNum = photo;
}
return self;
}

//画像選択ピッカー
-(void)openPhotoLib{
UIImagePickerControllerSourceType souceType;
//カメラ使用可能か
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
if (mediaNum == 0) {
souceType = UIImagePickerControllerSourceTypeCamera;
}else {
souceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
}else {
souceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = souceType;
[self presentModalViewController:picker animated:YES];
[picker release];
}

//画像選択後の処理
-(void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{
//モーダルを戻す
[self dismissModalViewControllerAnimated:YES];
//選択した画像の取得
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
//===ここでトリミングなどの処理をして===//
//処理完了後、デリゲート先へ通知
if ([delegate respondsToSelector:@selector(imgDidFinish:)]) {
[delegate performSelector:@selector(imgDidFinish:) withObject:image];
}
}

//画像選択キャンセル
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
//デリゲート先へ通知
if ([delegate respondsToSelector:@selector(imgCancel)]) {
[delegate performSelector:@selector(imgCancel)];
}
}

- (void)viewDidLoad {
[super viewDidLoad];
[self openPhotoLib];
}

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

.mは大分処理を端折っています。。。

これらを使う場合は、使用するクラスで、
普段使うDelegateと同じで
.hの

@interface UIViewController : UIViewController <ImgSelectControllerDelegate>

にprotocol <ImgSelectControllerDelegate> を追加

.mの方で、

ImgSelectController *imgSel = [[ImgSelectController alloc] init];
imgSel.delegate = self;

として、メソッドを実装すればdelegateが使えます。


Clip to Evernote

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.hirano-dept.com/mt/mt-tb.cgi/111
Listed below are links to weblogs that reference
iPhone/iPad @protocolで自前のDelegate from 袖触れ合うも多少の縁

Home > iPad > | iPhone > iPhone/iPad @protocolで自前のDelegate

Profile

iPhone/iPad開発 web制作:平野百貨店
iPhone/iPad開発・web制作・映像制作をしている平野百貨店の店長個人の覚書です。
ご意見・ご感想などお問合せはコチラからどうぞ。

※最近ツッコミをもらうので一応書いておきます。ブログのタイトル「袖触れ合うも多少の縁」はわざとです。正確には「袖振り合うも多生の縁」が正解です。

Search
iPhone Apps






RSS
リンク
のこぎりそうの日記

Return to page top