您好,欢迎来到花图问答。
搜索
您的当前位置:首页代理,通知,block

代理,通知,block

来源:花图问答

代理的使用:

代理是一对一.
首先要在需要传递值的类中声明一个协议

@protocol WZButtonDelegate <NSObject>
//可选
@optional
//声明一个方法
- (void)buttonClick;
@end

在这个类中定义一个delegate的属性,谁是它的代理

@property (nonatomic,weak) id<WZButtonDelegate> delegate;

在该类中当按钮要被点击的时候告诉他的代理,让代理去做事情

//为了防止程序崩溃,我们需要判断一下,是否实现了该方法.
if ([self.delegate respondsToSelector:@selector(buttonClick)]) {
    //执行代理方法
    [self.delegate buttonClick];
}

在代理对象遵守协议,成为代理.并实现代理方法.

//                           遵守协议
@interface ViewController ()<WZButtonDelegate>
//让控制器成为按钮的代理
button.delegate = self;
//实现代理方法
- (void)buttonClick {
    NSLog(@"控制器接受到了通知");
}

通知的使用:

通知可以一对多.

//创建通知中心
/** 
  * 观察者注册消息通知 
  * @param addObserver 观察者 self 
  * @param selector 回调方法 notification 
  * @param name 消息的名称 notifitionMassage
  * @param object 发送消息的对象,表示接收哪个发送者的通知,如果第四个参数为nil,则接收所有发送者的通知。 
  */
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notification:) name:@"notifitionMassage" object:nil];

发送消息

/** 
  * 发送消息通知 
  * @param postNotificationName 发送消息的名称 notifitionMassage 这里一定要和观察者中消息的名称一致,否则监测不到消息 
  * @param object 发送消息的对象 如果这里填nil,而且观察者要监测同时监测了好几个消息,但是这里我们只需要这一条特定的消息的时候,此时就无法达到我们想要的结果了。 
  */
[[NSNotificationCenter defaultCenter]postNotificationName:@"notifitionMassage" object:nil];

观察者回调的方法

/** 
  * 观察者处理消息(这个方法也就是观察者的回调方法) 
  * @param massage 接收到消息的信息,主要用于传值。(里面包含了Name:消息的名称 object:消息的发送者 userInfo:消息传递的数据信息) 
  */
-(void)notification:(NSNotification *)massage{ 
  //在这里做我们想要的操作
}

注销观察者

-(void)dealloc{ 
/** 
  * 移除观察者的方法 
  * @param removeObserver 监听的对象 self 
  * @param name 消息的名称 
  * @param object 发送消息的对象 如果发送消息的时候填写了对象,那么这里就是那个对象 
  */
[[NSNotificationCenter defaultCenter]removeObserver:self];

/** 移除单个观察者 */
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"notifitionMassage" object:nil];
}

block:

block是一个事先准备好的代码块,在调用的时候才执行.
定义一个block的属性

//定义一个block
typedef void(^block)(NSString *str);
//设置为属性
@property (nonatomic,copy) block string;

执行block方法

//调用方法时,进行判断防止没有实现方法出现报错的问题
if (self.string != nil) {
    self.string(@"按钮");
}

在控制器中执行block

//控制器中执行的方法.
btn.string = ^(NSString *str) {
    [btn setTitle:str forState:UIControlStateNormal];
};

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

热门图文

Copyright © 2019-2025 huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务