A->B 正向传值 (使用属性传值)
B->A 反向传值
1.代理传值
2.单例传值
3.Block传值
MVC设计模式
一 代理传值
委托者: 1)制定协议 (在委托者的 .h 文件里指定)
2)声明协议指针iddelegate
3)调用协议方法
代理者 1)遵守协议 (代理者遵守协议的同时,在转场事件里指定代理人
vcr.delegate =self)
2)实现协议方法
见【Demo】-【1-Delegate】
1.指定协议和声明协议指针
@protocol SecondViewControllerDelegate
-(void)postValue:(NSString *)text;
@end
@interface SecondViewController : UIViewController
//2.声明代理指针
//代理指针官方推荐使用assign修饰,原因是为了防止循环引用导致内存泄露
@property(nonatomic,assign)id
@end
3.调用协议
-(void)btnClick{
UITextField *field = (UITextField *)[self.view viewWithTag:100];
//调用协议方法(开始传值)
//调用协议方式是为了保证代码的安全性,最好先进行判断
if ([self.delegate respondsToSelector:@selector(postValue:)]) {
//如果代理人实现了方法则调用
[self.delegate postValue:field.text];
}
[self dismissViewControllerAnimated:YES completion:nil];
}
4.遵守协议和指定代理人
指定代理人是在跳转按钮事件中添加 vcr.delegate = self; 【关键】
5.实现协议方法
//2.实现协议方法
pragma mark -SecondViewControllerDelegate
-(void)postValue:(NSString *)text{
UILabel *label = (UILabel *)[self.view viewWithTag:100];
//把传过来的值赋值给label显示出来
label.text = text;
}
二 单例传值 (appDelegate 在一个程序中是唯一的)
AppDelegate *app = [[UIApplication sharedApplication] delegate];
单例对象:保证该对象在整个工程中仅有唯一的一个对象,所以单例对象存储的数据可以达到整个工程所共享;
什么时候用代理?什么时候用单例?
答: 代理,单例都能实现页面的反向传值;
单例对象是整个工程所共享的,所以单例对象里存储的数据可以被整个工程所共享,当大量类之间要共享数据的时候,使用单例;
代理传值,适合一对一的页面传值;
从内存角度来分析,单例对象比较特殊,生命周期是在程序退出的时候才销毁,故不宜滥用单例对象,避免内存浪费;
AppDelegate
在某种意义上,认为AppDelegate的本质其实也是一个单例对象,在整个应用程序中是唯一的,因为当前应用程序对象UIApplication对象是唯一的,那么UIApplication对象的代理人是唯一的,而这个代理人就是AppDelegate,故AppDelegate事一个唯一的代理对象,即是一个单例对象;
如何获得这个AppDelegate对象呢?
AppDelegate *app = [[UIApplication sharedApplication] delegate];
-(void)btnClick{
UITextField *field = (UITextField *)[self.view viewWithTag:100];
//用appDelegate这个单例丢向进行传值
//拿到应用程序对象,通过应用程序对象拿到它的代理对象
AppDelegate *app = [[UIApplication sharedApplication] delegate];
app.message = field.text; 【利用工程代理人的唯一性来传值】
// //拿到唯一的单例对象
// Singleton *sing = [Singleton shareSingLeton]; 【自定义的单例】
// //开始存储数据
// sing.text = field.text;
[self dismissViewControllerAnimated:YES completion:nil];
}
-(void)viewWillAppear:(BOOL)animated{ 【在视图将要出现的方法里重新赋值】
[super viewWillAppear:animated];
UILabel *label = (UILabel *)[self.view viewWithTag:100];
//拿到唯一的应用程序对象所对应的代理对象
AppDelegate *app = [[UIApplication sharedApplication] delegate];
label.text = app.message;
// //获取唯一的单例对象
// Singleton *sing = [Singleton shareSingLeton];
// //取出数据,并在label上展示
// label.text = sing.text;
}
三 使用Block代码块实现反向传值
void(^myBlock)() = ^{
};
int (^sumBlock)(int,int)=
^(int a,int b){
return a+b;
};
typedef int(^MyBlock)(int a,int b);
MyBlock block1 = ^(int a,int b){
return a+b;
};
将Block作为属性进行传值
1.在视图的 .h文件里添加Block属性
typedef void(^MyBlock)(NSString *message);
@interface SecondViewController : UIViewController
//把block声明成属性;
@property(nonatomic,copy)MyBlock block;
@end
2.在视图的 .m文件的按钮事件里给Block参数赋值,进行传值;
-(void)btnClick{
UITextField *field = (UITextField *)[self.view viewWithTag:100];
//回调(调用代码块,实现传值的功能)
self.block(field.text);
[self dismissViewControllerAnimated:YES completion:nil];
}
3.在上一个视图里的跳转按钮的事件里面添加以下代码:
SecondViewController *vcr = [[SecondViewController alloc] init];
vcr.block = ^(NSString *message){
//凡是在block代码块内访问外面的对象,那么该对象用__block去修饰;
label.text = message;
};
四 MVC设计模式
iOS程序都采用MVC设计模式为基础设计模式,即一个程序的构成,由数据模型,视图,视图控制器。。
M:模型 model,负责存储数据,处理数据,相关的业务逻辑,网络通讯,多线程处理,文件操作等。。
V:视图 View ,只负责显示界面,展示数据;
C:视图控制器 controller ,负责将M和V关联起来,将M中的数据传给V显示,也负责将V接受的用户操作反馈给M。。
是M和V之间沟通的一个渠道。
好处:功能模块化,减少代码之间的依赖性,耦合性