iOS 委托代理(delegate)
本质:我提供一个我自己的委托(方法)。你如果要使用我这个方法,确认代理(设置代理=self)就可以使用。
作用:
1:方法延续(引导页动画结束后跳转到主界面)(不需要带传递参数)
2:实现页面传值 ( TwoVc 传值给 OneVc )(有传递参数)
实现步骤
委托方
.h中
a.定义协议与方法
b.声明委托变量
.m中
a.设置代理
b.通过委托变量调用委托方法
代理方:
a.遵循协议
b.实现委托方法
例子详解
可以参考这个列子:联动效果实现
TwoViewController.h (引导页/传值页)
@protocol selfDelegate<NSObject>
- (void)passValue:(NSString *)values://带参数的方法
- (void)doSomethingDelegate//不带参数的方法
@end
@interface TwoViewController : UIViewController
@property (nonatomic, assign) id<selfDelegate>SelfDelegate;
@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