页面传值:属性,协议,Block传值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了页面传值:属性,协议,Block传值相关的知识,希望对你有一定的参考价值。

1.属性传值和协议传值

 1 #import "RootViewController.h"
 2 #import "SecondViewController.h"
 3 #warning 第四步:签订协议
 4 @interface RootViewController ()<SecondViewControllerDelegate>
 5 @property(nonatomic,strong)UILabel *showTextLable;
 6 @end
 7 
 8 @implementation RootViewController
 9 
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     // Do any additional setup after loading the view.
13     self.view.backgroundColor = [UIColor whiteColor];
14     self.navigationItem.title = @"首页";
15     //创建UILable用于显示内容
16     UILabel *showTextLable = [[UILabel alloc] initWithFrame:CGRectMake(100, 200, 150, 50)];
17     showTextLable.backgroundColor = [UIColor yellowColor];
18     showTextLable.text = @"美女帅哥";
19     showTextLable.textAlignment = NSTextAlignmentCenter;
20     [self.view addSubview:showTextLable];
21     self.showTextLable = showTextLable;
22     
23     //创建推出下个界面的UIButton
24     UIButton *pushNextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
25     pushNextBtn.frame = CGRectMake(100, 300, 150, 50);
26     pushNextBtn.backgroundColor = [UIColor magentaColor];
27     [pushNextBtn setTitle:@"下一页" forState:UIControlStateNormal];
28     [pushNextBtn addTarget:self action:@selector(pushNextController) forControlEvents:UIControlEventTouchUpInside];
29     [self.view addSubview:pushNextBtn];
30     
31     
32 }
33 -(void)pushNextController
34 {
35     SecondViewController *secondVC = [[SecondViewController alloc] init];
36     //需要把lable的text传给
37     //下面这种传值方法是错误的,因为textField还没有创建,还没有加载到视图上,这里是项目期特别容易犯错的地方,必须要考虑视图加载的顺序
38     //secondVC.textField.text = self.showTextLable.text;
39     //正确的写法应该是直接传送文本内容
40     secondVC.content = self.showTextLable.text;
41     //
42 #warning 第五步:指定代理人
43     secondVC.secondViewControllerDelegate = self;//指定协议代理人
44     [self.navigationController pushViewController:secondVC animated:YES];
45 }
46 #warning 第六步:实现协议的方法
47 -(void)changeValue:(NSString *)text
48 {
49     self.showTextLable.text = text;
50 }
51 - (void)didReceiveMemoryWarning {
52     [super didReceiveMemoryWarning];
53     // Dispose of any resources that can be recreated.
54 }
 1 #import <UIKit/UIKit.h>
 2 #warning 第一步:声明协议
 3 @protocol SecondViewControllerDelegate <NSObject>
 4 
 5 -(void)changeValue:(NSString *)text;
 6 @optional//可选的协议方法
 7 -(void)changeColor:(UIColor *)color;
 8 
 9 @end
10 @interface SecondViewController : UIViewController
11 /**
12  *  显示文本输入框的
13  */
14 @property (nonatomic,strong) UITextField *textField;
15 /**
16  *  显示文本输入框的内容文本
17  */
18 @property (nonatomic,strong) NSString *content;
19 #warning 第二步:声明代理人
20 /**
21  *  第二个Controller中的协议,
22     assign必须循环引用
23  */
24 @property (nonatomic,assign)id<SecondViewControllerDelegate>secondViewControllerDelegate;
25 @end
 1 #import "SecondViewController.h"
 2 
 3 @interface SecondViewController ()
 4 
 5 @end
 6 
 7 @implementation SecondViewController
 8 
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     // Do any additional setup after loading the view.
12     self.view.backgroundColor = [UIColor whiteColor];
13     self.navigationItem.title= @"第二页";
14     //创建输入文本的文本框
15     UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 200, 150, 50)];
16     textField.placeholder = @"请输入文本内容";
17     textField.borderStyle = UITextBorderStyleRoundedRect;
18     [self.view addSubview:textField];
19     self.textField = textField;
20     self.textField.text = self.content;
21     
22     //创建UIButton用于返回上一个界面
23     UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
24     backBtn.frame = CGRectMake(100, 300, 150, 50);
25     [backBtn setTitle:@"返回" forState:UIControlStateNormal];
26     backBtn.backgroundColor = [UIColor blackColor];
27     [backBtn addTarget:self action:@selector(popButtonAction) forControlEvents:UIControlEventTouchUpInside];
28     [self.view addSubview:backBtn];
29     
30     
31 }
32 -(void)popButtonAction
33 {
34 #warning 第三步:执行相关的协议方法
35     [self.secondViewControllerDelegate changeValue:self.textField.text];
36     [self.navigationController popViewControllerAnimated:YES];
37 }
38 //总结:属性传值:一般使用从前往后进行传值的情况
39 //如果从后往前,需要借助其他传值方式
40 //协议传值方式
41 /**
42  *  实现协议的六个步骤:
43  第一步:声明协议
44  第二步:声明代理人
45  第三步:执行协议方法
46  第四步:签订协议
47  第五步:指定代理人
48  第六步:实现协议方法
49  */

2.Block传值

 1 #import "RootViewController.h"
 2 #import "SecondViewController.h"
 3 @interface RootViewController ()
 4 @property(nonatomic,strong)UILabel *showTextLable;
 5 @end
 6 
 7 @implementation RootViewController
 8 
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     // Do any additional setup after loading the view.
12     UILabel *showLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 200, 150, 50)];
13     showLabel.backgroundColor = [UIColor redColor];
14     showLabel.text = @"美女帅哥";
15     showLabel.textAlignment = NSTextAlignmentCenter;
16     showLabel.font = [UIFont systemFontOfSize:24];
17     [self.view addSubview:showLabel];
18     self.showTextLable = showLabel;
19     UIButton *nextBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
20     nextBtn.frame = CGRectMake(100, 300, 150, 50);
21     nextBtn.backgroundColor = [UIColor yellowColor];
22     [nextBtn setTitle:@"下一页" forState:UIControlStateNormal];
23     [nextBtn addTarget:self action:@selector(showNextAction) forControlEvents:UIControlEventTouchUpInside];
24     [self.view addSubview:nextBtn];
25     
26 }
27 -(void)showNextAction
28 {
29     SecondViewController *secondView = [[SecondViewController alloc] init];
30     [self.navigationController pushViewController:secondView animated:YES];
31     //ARC模式下用__weak修饰可解决内存泄漏问题,MRC模式下用__block
32     __weak typeof (self)weakSelf = self;
33 #warning 第三步:实现Block的内容(实现传递过来的内容)
34     secondView.changeValueBlock = ^(NSString *string){
35         //下面这种引用容易造成内存泄漏
36         //self.showTextLable.text = string;
37         weakSelf.showTextLable.text = string;
38     };
39     //block的核心是:回调,Block作为属性进行传值的时候,一般使用场景是从第二个界面返回到上一个界面,基本步骤:
40     //1.在第二个界面中声明一个Block属性
41     //2.在第二个界面返回的那句代码之前加上Block需要传递的内容
42     //3.在一个界面推出第二个界面那句代码之前,对Block进行实现(即接受Block传递过来的内容)
43      secondView.content = self.showTextLable.text;
44 }
1 #import <UIKit/UIKit.h>
2 
3 @interface SecondViewController : UIViewController
4 @property (nonatomic,strong) NSString *content;
5 @property (strong,nonatomic) UITextField *textField;
6 #warning 第一步:声明Block属性,copy是为了解决循环引用的问题
7 @property (nonatomic,copy) void(^changeValueBlock)(NSString *string);
8 @end
 1 #import "SecondViewController.h"
 2 
 3 @interface SecondViewController ()
 4 
 5 @end
 6 
 7 @implementation SecondViewController
 8 
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     // Do any additional setup after loading the view.
12     self.view.backgroundColor = [UIColor whiteColor];
13     self.view.backgroundColor = [UIColor whiteColor];
14     self.navigationItem.title= @"第二页";
15     //创建输入文本的文本框
16     UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 200, 150, 50)];
17     textField.placeholder = @"请输入文本内容";
18     textField.borderStyle = UITextBorderStyleRoundedRect;
19     [self.view addSubview:textField];
20     self.textField = textField;
21     self.textField.text = self.content;
22     
23     //创建UIButton用于返回上一个界面
24     UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
25     backBtn.frame = CGRectMake(100, 300, 150, 50);
26     [backBtn setTitle:@"返回" forState:UIControlStateNormal];
27     backBtn.backgroundColor = [UIColor blackColor];
28     [backBtn addTarget:self action:@selector(popButtonAction) forControlEvents:UIControlEventTouchUpInside];
29     [self.view addSubview:backBtn];
30 }
31 -(void)popButtonAction
32 {
33 #warning 第二步:将要传递的内容通过属性block先给它
34     self.changeValueBlock(self.textField.text);
35   
36     [self.navigationController popViewControllerAnimated:YES];
37 }

 

以上是关于页面传值:属性,协议,Block传值的主要内容,如果未能解决你的问题,请参考以下文章

属性传值 Block传值

界面之间的传值

iOS几种常见的页面传值方式

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

iOS 页面间几种传值方式(属性,代理,block,单例,通知)

iOS 页面间几种传值方式(属性,代理,block,单例,通知)