协议传值六个步骤:
第一步:在第二个页面的.h文件中声明一个协议,并且声明一个协议方法
#pragma mark- 制定协议第一步:声明一个协议,并且声明一个协议方法
//协议命名规范:类名 + Delegate
@protocol SecondViewControllerDelegate <NSObject>
//传值的内容作为协议方法参数
-(void)passSting:(NSString *)string;
@end
第二步:添加代理人属性,在.文件的@interface 中声明一个属性,让外部能够访问到
#pragma mark-- 协议传值第二步:添加代理人属性
@interface SecondViewController : UIViewController
@property(nonatomic,weak)id<SecondViewControllerDelegate>delegate;
@end
第三步:让代理人执行传值的协议方法,一般写在返回到上个页面的方法中,为了安全起见,我们需要判断代理人存在,且相应该协议方法
//跳转到上一个页面的方法
- (void)backBarButtonItem:(UIBarButtonItem *)sender {
#pragma mark-- 协议传值第三步,让代理人执行传值的协议方法
//代理人存在且响应协议的方法
if (self.delegate && [self.delegate respondsToSelector:@selector(passSting:)]) {
[self.delegate passSting:self.textField.text];
}
[self.navigationController popViewControllerAnimated:YES];
}
第四步:在第一个页面签订协议
#pragma mark--协议传值第四步:签订我们声明协议
@interface RootViewController ()<SecondViewControllerDelegate>
第五步:指定代理人,谁声明的协议谁来指定代理人
//这个是SecondViewController的协议,需要他来指定代理人
- (void)buttonAction:(UIButton *)button {
SecondViewController *secondVC = [[SecondViewController alloc] init];
#pragma mark--协议传值第五步:指定代理人
secondVC.delegate = self;
[self.navigationController pushViewController:secondVC animated:YES];
}
第六步:实现协议方法
#pragma mark--协议传值第六步:实现协议方法
-(void)passSting:(NSString *)string {
self.label.text = string;
}
协议传值到此就结束了,本文如有错误,欢迎交流,需要此Demo,请点击下载http://pan.baidu.com/s/1o8tN7cu
block传值
block 语法格式
返回值类型 (^block变量名)(参数列表) = ^(参数列表){
返回值
};
//1.无参无返回值的block
void(^block1)(void) = ^(void){
NSLog(@"呵呵");
};
block1();
//2.有参有反
int (^block2)(int a,int b) = ^(int a,int b){
return a + b;
};
int sum = block2(1,2);
NSLog(@"%d",sum);
//在block里面使用局部变量
//在block中使用局部不变本量,当代吗执行到block的定义时,虽没有执行block中的代码,但是系统会自动开辟一块空间,将局部变量的值拷贝一份存进去,也就是说,block中的局部变量和之前定义的局部变量不是同一个变量
__block int aa = 10;
void (^testBlock)(void) = ^(void) {
NSLog(@"aa = %d %p",aa,&aa);
};
aa = 100;
NSLog(@"%d %p",aa,&aa);
testBlock();
block 传值三个步骤
第一步:声明block 类型的属性
#pragma mark--block传值第一步:在第二个页面的 .h 文件声明block类型的属性
@property(nonatomic,copy)void(^block)(NSString *str);
第二步:调用传值的时候调用block,在返回上个页面的时候进行传值
- (void)backBarButtonItem:(UIBarButtonItem *)sender {
#pragma mack--传值第二步:调用传值的时候调用block
self.block(self.textField.text);
[self.navigationController popViewControllerAnimated:YES];
}
第三步:实现 block 在第一个页面
- (void)buttonAction:(UIButton *)button {
SecondViewController *secondVC = [[SecondViewController alloc] init];
#pragma mark--传值第三步:实现block
//ARC下用__weak MRC下用__block;
__weak RootViewController *rootVC = self;
secondVC.block = ^(NSString *str){
rootVC.label.text = str;
};
[self.navigationController pushViewController:secondVC animated:YES];
}
Demo下载链接 http://pan.baidu.com/s/1dF0l6TF
iOS 通知中心(NSNotificationCenter)
在这里第一步和第二步的顺序可以互换,一般楼主我喜欢先在需要发送消息的页面发送消息,然后再在需要监听的页面注册监听。
第一步:注册观察者
/**
* 观察者注册消息通知
*
* @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{
//在这里做我们想要的操作
}
第四步:注销观察者
a.最好的办法就是在注册观察者的页面的dealloc方法中去移除观察者
-(void)dealloc{
/**
* 移除观察者的方法
*
* @param removeObserver 监听的对象 self
*
* @param name 消息的名称
*
* @param object 发送消息的对象 如果发送消息的时候填写了对象,那么这里就是那个对象
*/
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
b.单个移除
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"notifitionMassage" object:nil];