一.委托代理传值
1.步骤
1.1 设置协议及方法(B界面实现)
1 @protocol secondViewDelegate
2 -(void)showName:(NSString *)nameString;
1.2设置代理(B界面实现)
1 @property (nonatomic, weak)id<secondViewDelegate> delegate;
1.3调用代理(B界面实现)
1 - (IBAction)delegateMethod:(id)sender {
2 if ([self notEmpty]) {
3 [self.delegate showName:self.nameTextField.text];
4 [self dismissViewControllerAnimated:YES completion:nil];
5 }else{
6 [self showAlert];
7 }
8 }
1.4.实现,显示所传的值(A界面实现)
1 -(void)showName:(NSString *)nameString{ 2 self.nameLabel.text = nameString; 3
2.1委托需要做的工作有:(要求传值的一方是委托,既B界面)
2.1.1定义协议与方法
2.1.2声明委托变量
2.1.3设置代理
2.1.4通过委托变量调用委托方法
2.2.代理需要做的工作有:(接收传值的一方是代理一方,既A界面)
2.2.1遵循协议
2.2.2实现委托方法
二.通知传值
1.步骤
1.1.创建一个通知对象(B界面实现)
1 //通知:1.创建一个通知对象及发送通知
2 - (IBAction)notificationMethod:(id)sender {
3 if ([self notEmpty]) {
4 [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeNameNotification" object:self userInfo:@{@"name":self.nameTextField.text}];
5 [self dismissViewControllerAnimated:YES completion:nil];
6 }else{
7 [self showAlert];
8 }
9 }
1.2.注册通知(A界面实现)
1 - (void)viewDidLoad
2 {
3 [super viewDidLoad];
4 // 通知2:注册通知
5 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:) name:@"ChangeNameNotification" object:nil];
6 }
1.3发送通知(B界面实现)
1.4接收通知(A界面实现)
1 //通知4:调用、显示通知
2 -(void)ChangeNameNotification:(NSNotification*)notification{
3 NSDictionary *nameDictionary = [notification userInfo];
4 self.nameLabel.text = [nameDictionary objectForKey:@"name"];
5 }
1.5移除通知(A界面实现)
//通知3:不使用时,删掉通知
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
2.优缺点分析
优点:通知的发送者和接受者不需要知道对方,可以指定接收通知的具体方法。通知名可以是任何字符串
缺点:较键值观察需要多点代码,在删除前必须移除监听者。不能传大量数值,只能让谁去做什么事
三.通过block传值
1.步骤
1.block定义,并申明一个block属性(在B界面实现)
1void
1 @property (nonatomic, copy) ablock block;//定义一个block属性
2.输入需要传值的对象,点击相应按钮(在B界面实现)
1 //block传值2:在B试图控制器中,当输入名字,点击对应的确定按钮后
2 - (IBAction)blockMethod:(id)sender {
3 if ([self notEmpty]) {
4 if (self.block) {
5 self.block(self.nameTextField.text);
6 [self dismissViewControllerAnimated:YES completion:nil];
7 }
8 }else{
9 [self showAlert];
10 }
11 }
3.回调block实现传值(在A界面实现)
1 - (IBAction)showSecondWithBlock:(id)sender {
2 SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
3 second.flag = 1;
4 [self presentViewController:second animated:YES completion:nil];
5 second.block = ^(NSString *str){
6 self.nameLabel.text = str;
7 };
8 }
四.通过NSUserdefault来传值
步骤
1. 通过NSUserdefault来存值(在B界面实现)
1 //通过文件或者UserDefault方式存值
2 - (IBAction)userDefaultMethod:(id)sender {
3 if ([self notEmpty]) {
4 [[NSUserDefaults standardUserDefaults] setObject:self.nameTextField.text forKey:@"myNameText"];
5 [self dismissViewControllerAnimated:YES completion:nil];
6 }else{
7 [self showAlert];
8 }
9 }
2. 通过NSUserdefault来取值(在A界面实现)
1 // 通过UserDefault方式取值
2
3 if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"] length] != 0) {
4 self.nameLabel.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"];
5 [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"myNameText"];
6 }
NSUserDefaults用法注意点
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。
NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型
五.单例传值
1.步骤
1.1定义一个单例类,并在类里面定义一个要监控的属性以及建立一个单例对象
1 #import <Foundation/Foundation.h>
2
3 @interface DataSource : NSObject
4 @property (nonatomic, strong) NSString *myName;//要监视的属性
5 +(DataSource*)sharedDataSource;//建立单例对象
6 @end
1 #import "DataSource.h"
2
3 @implementation DataSource
4 +(DataSource *)sharedDataSource{
5 static DataSource *dataSource = nil;
6 static dispatch_once_t once;
7 dispatch_once(&once, ^{
8 dataSource = [DataSource new];
9 });
10 return dataSource;
11 }
12 @end
1.2.写入需要传值的对象(B界面实现)
1 //通过单例方式传值:写入要传入的数据
2 - (IBAction)singletonMethod:(id)sender {
3 if ([self notEmpty]) {
4 DataSource *dataSource = [DataSource sharedDataSource];
5 dataSource.myName = self.nameTextField.text;
6 [self dismissViewControllerAnimated:YES completion:nil];
7 }else{
8 [self showAlert];
9 }
10 }
1.3.通过单例传值方法获取对象(A界面实现)
1 //通过单例取值
2
3 DataSource *dataSource = [DataSource sharedDataSource];
4
5 if ([dataSource.myName length] != 0) {
6
7 self.nameLabel.text = dataSource.myName;
8
9 dataSource.myName = @"";
10
11 }
六、代理传值与通知传值间的比较
1.效率肯定是delegate比nsnotification高
2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。相反的,notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。
二、Delegate与单例KVO和NSNotification的区别:
和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是
1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;
2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。