際際滷

際際滷Share a Scribd company logo
iOSハンズオントレ`ニング
Delegate(溜j)、Noti?cation(宥岑)、KVO(キ`アO)

?寄消隠?
朕肝
Observerパタ`ン

Delegate(溜j)

Noti?cation(宥岑)

KVO : Key-Value 或恢壊艶姻厩庄稼乙(キ`シ猜)
Observerパタ`ン
Observerパタ`ンに鞠するのは、2つのクラスだ。
Oするクラスと、Oされて宥岑を佩うクラスだ。
Oするクラスの圭を、Observerクラスと柵ぼう。
もう匯圭のOされるクラスの圭は、Subjectクラ
スとする。
Delegate(溜j)
溜j圷オブジェクトのポインタを卞j枠オブジェクトで
隠隔し、溜j枠オブジェクトから溜j圷オブジェクトの
メソッドをコ`ルする。???コ`ルバック
Delegateg廾
g廾イメ`ジ
アルバムに亟寔を塘崔、亟寔がタップされ
たらそのxばれた亟寔のI尖をしたい。
O箸Observerクラス

Oされる箸Subject

をUIView

クラスをUIImageView

タップされた
らHクラスの
メソッドをコ`
ルバックする。
Delegateg廾
Subjectクラスの恬撹
UIImageViewクラスを仟たに恬撹する。

UIImageViewクラスに、Observerクラスのポインタを
隠隔するメンバ篳を弖紗する。

ユ`ザ荷恬を鞭け原けるように筝する。
self.userInteractionEnabled = YES;

タップされたら、Observerクラスのメソッドをコ`ル
する。
☆ベ`スとなるプロジェクトをダウンロ`ドしてください。

https:/
/github.com/ovjang/NoUseStoryBoard_Observer
//
//
//

PictureView.h

!
#import <UIKit/UIKit.h>
!

@interface PictureView : UIImageView
{
@private
NSObject *delegate_;
}

!
@property NSObject *delegate;
!
@end
//
//
//

PictureView.m

!
#import "PictureView.h"
!

@implementation PictureView
@synthesize delegate = delegate_;

!

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.userInteractionEnabled = YES; // UIImageViewはデフォルトでNoなので廣吭
}
return self;
}

!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if(delegate_ !=nil) {
[delegate_ pictureSelected];
}
}

!

@end
Delegateg廾
┘廛蹈肇灰襪臨撹
プロトコルを仟たに恬撹する。

subjectクラスのメンバ篳に、プロトコルを峺協
する。

タップされたHに柵ぶメソッドで、プロトコルに
していることを_Jする。
//
//

PictureViewDelegate.h?(javaでいうところのインタ`フェ`ス)

//

!
#import <Foundation/Foundation.h>
!

@protocol PictureViewDelegate <NSObject>
@optional
-(void)pictureSelected; // 渇鵐瓮愁奪

!

@end
//
//
//

PictureView.h

!

#import <UIKit/UIKit.h>
#import "PictureViewDelegate.h"

!

@interface PictureView : UIImageView
{
@private
NSObject <PictureViewDelegate> *delegate_;
}
@property NSObject <PictureViewDelegate> *delegate;
@end
//
//
//

PictureView.m

!
#import "PictureView.h"
!

@implementation PictureView
@synthesize delegate = delegate_;

!

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.userInteractionEnabled = YES;
}
return self;
}

!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if(delegate_ !=nil) {
if ([delegate_ conformsToProtocol:@protocol(PictureViewDelegate)]) {
if ([delegate_ respondsToSelector:@selector(pictureSelected)]) {
[delegate_ pictureSelected];
}
}
}
}
@end
Delegateg廾
Observerクラスの恬撹
屡贋のUIViewControllerを、Observerクラスにしま
す。また、プロトコルにさせる。

Subjectクラスを、newして鮫中に塘崔する。

Subjectクラスのメンバ篳に、徭蛍のポインタを鯉{
する。

プロトコルにあるメソッドをg廾する。
//

Screen1ViewController.h

!

#import <UIKit/UIKit.h>
#import "PictureViewDelegate.h"

!
@interface Screen1ViewController : UIViewController <PictureViewDelegate>
!
@end

/

!

Screen1ViewController.m

#import "Screen1ViewController.h"
#import "PictureView.h"

!
@interface Screen1ViewController ()
!
@end
!
@implementation Screen1ViewController
!

- (id)init
{
self = [super init];
if (self) {
// Custom initialization
self.title = @"Album";
self.view.backgroundColor = [UIColor grayColor];
}
return self;
}

!

- (void)viewDidLoad
{
[super viewDidLoad];
UIImage* image01 = [UIImage imageNamed:@"picture01.jpeg"];
PictureView* uiImageView1 = [[PictureView alloc]
initWithFrame:CGRectMake(10, 10, 100, 150)];
uiImageView1.delegate = self;
uiImageView1.image = image01;
[self.view addSubview:uiImageView1];

!

UIImage* image02 = [UIImage imageNamed:@"picture02.jpeg"];
PictureView* uiImageView2 = [[PictureView alloc]
initWithFrame:CGRectMake(120, 10, 100, 150)];
uiImageView2.delegate = self;
uiImageView2.image = image02;
[self.view addSubview:uiImageView2];

}

!

-(void)pictureSelected {
NSLog(@"Push");
}

!

@end
Noti?cation(宥岑)
嶼初叨がObserverクラスと、Subjectクラ
スのひも原けとBjを佩う。
OK
Tapって宥岑があったら縮えてね

Observer

クラス

Subject

クラス

NSnoti?cationCenter

addObserver

宥岑があったら、これを

コ`ルバックしてね

Observer

クラス

。
Tapって宥岑を僕る

NSnoti?cationCenter

postNoti?cation

Subject

クラス

宥岑あった
Tapって宥岑をあったよ。

Observer

クラス

NSnoti?cationCenter
コ`ルバック

Subject

クラス
Noti?cationg廾
Noti?cationCenterにObserber鞠h
NSNotificationCenterを函誼する。
Observerを鞠hする。岑らせて圀しい宥岑と、岑らせ
るHに柵び竃してもらうセレクタ`を峺協する。┐海
弟の卦並だけ、縮えてねということもできます。
//
//
//

Screen1ViewController.m

!

#import "Screen1ViewController.h"
#import "PictureView.h"

!
@interface Screen1ViewController ()
!
@end
!
@implementation Screen1ViewController
!

- (id)init
{
self = [super init];
if (self) {
// Custom initialization
self.title = @"Album";
self.view.backgroundColor = [UIColor grayColor];
// NSNotificationCenterを函誼する
NSNotificationCenter* center;
center = [NSNotificationCenter defaultCenter];
// Observerとして鞠hする
[center addObserver:self selector:@selector(pictureSelected:)
name:@"PictureTaped" object:nil];
}
return self;
}
Noti?cationg廾
宥岑を僕る
NSNotificationCenterを函誼する。
僕る宥岑(NSNotification)を恬撹する。
NSNotificationCenterに、宥岑を僕る。
//
//
//

PictureView.m

!
#import "PictureView.h"
!
@implementation PictureView
!

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.userInteractionEnabled = YES;
}
return self;
}

!

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
// NSNotificationを恬撹する
NSNotification* notification;
notification = [NSNotification notificationWithName:@"PictureTaped"
object:self userInfo:nil];
// NSNotificationCenterを函誼する
NSNotificationCenter* center;
center = [NSNotificationCenter defaultCenter];
// 宥岑を佩う
[center postNotification:notification];
}

!

@end

//
//
//

PictureViewDelegate.h

!
#import <Foundation/Foundation.h>
!

@protocol PictureViewDelegate <NSObject>
@optional
-(void)pictureSelected:(NSNotification *)notification;

!

@end
Noti?cationg廾
宥岑を鞭け函る
コ`ルバックされてくるメソッドで、宥岑
(NSNotification)を鞭け函る。
NSNotificationに根まれる秤鵝
UserInfo(NSDictionary)の嶄附をもとに駅勣な
I尖を佩う。
//
//
//

Screen1ViewController.m

!

#import "Screen1ViewController.h"
#import "PictureView.h"

!
@interface Screen1ViewController ()
!
@end
!
@implementation Screen1ViewController
!

- (id)init
{
self = [super init];
if (self) {
// Custom initialization
self.title = @"Album";
self.view.backgroundColor = [UIColor grayColor];
// NSNotificationCenterを函誼する
NSNotificationCenter* center;
center = [NSNotificationCenter defaultCenter];
// Observerとして鞠hする
[center addObserver:self selector:@selector(pictureSelected:)
name:@"PictureTaped" object:nil];
}
return self;
}

!

- (void)viewDidLoad
{
[super viewDidLoad];
UIImage* image01 = [UIImage imageNamed:@"picture01.jpeg"];
PictureView* uiImageView1 = [[PictureView alloc]
initWithFrame:CGRectMake(10, 10, 100, 150)];
uiImageView1.image = image01;
uiImageView1.tag = 1;
[self.view addSubview:uiImageView1];

!

UIImage* image02 = [UIImage imageNamed:@"picture02.jpeg"];
PictureView* uiImageView2 = [[PictureView alloc]
initWithFrame:CGRectMake(120, 10, 100, 150)];
uiImageView2.image = image02;
uiImageView2.tag = 2;
[self.view addSubview:uiImageView2];

}

!

-(void)pictureSelected:(NSNotification*)notification {
NSLog(@"Push %@",notification.userInfo);
}

!

@end
KVO(キ`アO)
キ`アOとは、ほかのオブジェクトに奉する蒙協の
プロパティの篁について宥岑をオブジェクトが鞭け
函れるようにする碧Mみです。(キ`アOに駅勣な
メソッドは、ル`トクラスであるNSObjectにg廾さ
れている。
KVOg廾
Subjectクラス
Oする、魍屬張ラスを恬撹する。
//
//
//

KVOclass.h

!
#import <Foundation/Foundation.h>
!
@interface KVOclass : NSObject
{
int value_;
}
@property int value;

!

@end

//
//
//

KVOclass.m

!
#import "KVOclass.h"
!

@implementation KVOclass
@synthesize value = value_;

!

@end
KVOg廾
Subjectクラス
Subjectクラスにオブザ`バ`を弖紗する。
OBserverクラスに、筝宥岑を鞭け函るメソッド
を、オ`バ`ライドする。
//
//
//

Screen1ViewController.m

!

#import "Screen1ViewController.h"
#import "KVOclass.h"
@interface Screen1ViewController ()

!
@end
!
@implementation Screen1ViewController
!

- (id)init
{
self = [super init];
if (self) {
// Custom initialization
self.title = @"KVO Test";
self.view.backgroundColor = [UIColor grayColor];
}
return self;
}

!

- (void)viewDidLoad
{
[super viewDidLoad];

!
!

KVOclass* kvo01 = [KVOclass new];
[kvo01 addObserver:self forKeyPath:@"value" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
KVOclass* kvo02 = [KVOclass new];
[kvo02 addObserver:self forKeyPath:@"value" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil];
kvo01.value = 1; // 、筝

}

!

- (void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context
{
if ([keyPath isEqual:@"value"])
{
NSLog(@"New Key = %@",[change objectForKey:NSKeyValueChangeNewKey]);
}
}

!

@end

More Related Content

iOSハンズオントレ`ニング observer (delegate,notification,KVO)