一.委托代理传值

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只是一对一,而这两个可以一对多。这两者也有各自的特点。