一.委托代理传值
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界面实现)
1 typedef void (^ablock)(NSString *str);
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只是一对一,而这两个可以一对多。这两者也有各自的特点。