iOS 开发:代理+KVO+通知+Block

iOS 委托代理(delegate)

本质:我提供一个我自己的委托(方法)。你如果要使用我这个方法,确认代理(设置代理=self)就可以使用。

作用:

1:方法延续(引导页动画结束后跳转到主界面)(不需要带传递参数)

2:实现页面传值 ( TwoVc 传值给  OneVc )(有传递参数)

实现步骤

委托方

.h中

a.定义协议与方法

b.声明委托变量

.m中

a.设置代理

b.通过委托变量调用委托方法

代理方:

a.遵循协议

b.实现委托方法

例子详解

可以参考这个列子:联动效果实现

TwoViewController.h (引导页/传值页)

@protocol selfDelegate

- (void)passValue:(NSString *)values://带参数的方法

- (void)doSomethingDelegate//不带参数的方法

@end

@interface  TwoViewController : UIViewController  

@property (nonatomic, assign) idSelfDelegate;

@end

TwoViewController.m

//引导页消失的方法后面实现代理方法

if (self. SelfDelegate && [self. SelfDelegate respondsToSelector:@selector(doSomethingDelegate)])

{

     [self. SelfDelegate doSomethingDelegate];

}


AppDelegate.m

TwoViewController *guideview = [[TwoViewController alloc]init];

guideview.gotodelegate = self;//设置代理


- (void)doSomethingDelegate{

//实现代理方法:---->跳转到首页

带参数的传值同理:这里就不记录了

可以参考链接:代理参数传值


KVO传值

添加

[***(谁被观察-改变) addObserver:self forKeyPath:@"isEdit" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

移除

- (void)dealloc {

[*** removeObserver:self forKeyPath:@"isEdit"];

}

回调

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

if ([keyPath isEqualToString:@"isEdit"]) {

}

}


通知传值

<1>在我们需要时发送通知消息(发送:消息写在userInfo中)

NSDictionary *dic =@{@"num":[NSString stringWithFormat:@"%lu",(unsigned long)self.detailArray.count]};

[[NSNotificationCenter defaultCenter] postNotificationName:@"shoppingCarNum" object:nil userInfo:dic];

<2>我们在需要接收通知的地方注册观察者(注意移除)

获取通知中心单例对象。添加当前类对象为一个观察者,name和object设置为nil,表示接收一切通知

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notice:) name:@"shoppingCarNum" object:nil];

我们可以在回调的函数中取到userInfo内容,如下:

-(void)notice:(NSNotification *)notification{

self.label.text=[notification.userInfo objectForKey:@“1”];

}

消息发送完,要移除掉

- (void)dealloc  {

//移除所有通知

[[NSNotificationCenter defaultCenter] removeObserver:self];

//移除指定通知

[[NSNotificationCenter defaultCenter]removeObserver:self name:@"labelTextNotification" object:nil];

[super dealloc];

}


Block传值

<1>声明 cell.h

@property (nonatomic,copy)  void(^shopCartBlock)(UIImageView *imageView,NSInteger selectRow);

也可以这么写Block

typedef void (^SelfBlock)(UIImageView *imageView,NSInteger selectRow);

@property (nonatomic,copy) SelfBlock shopCartBlock;

<2>实现  cell.m

if (self.shopCartBlock) {

self.shopCartBlock(self.CommodityImage,path.row);

}

<3>调用  **.m

cell.shopCartBlock = ^(UIImageView *imageView,NSInteger selectRow) {   }

学无止境,做个记录

2017-02-5-SXH

你可能感兴趣的:(iOS 开发:代理+KVO+通知+Block)