控制器之间的数据传递——代理传值
2016-08-29 18:07
211 查看
代理传值
我们先在这里约定:界面1传值到界面2为顺传,界面2传值到界面1为逆传一般用代理传值是为了降低视图控制器之间的耦合度,主要用于逆序传值。
对于属性传值,传递方必须要有一个保存接收方的属性,而代理传值不需要知道接收方是谁,只要其代理遵守代理协议,就可以获取通过代理方法传出的数据模型
一. 实现步骤
界面2实现一个代理协议界面2设置一个代理属性
界面2通知其代理做事情
界面2在入栈之前,设置界面1为其代理
界面1实现代理方法,实现传值
二. 具体代码
1. AppDelegate类
---------- AppDelegate.m文件 #import "AppDelegate.h" #include "OneViewController.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1. 创建窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // 2. 创建窗口的根控制器 // 2.1 创建导航控制器的根控制器 UIViewController *oneVc = [[OneViewController alloc] init]; // 2.2 创建导航控制器 UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:oneVc]; // 2.3 给窗口设置根控制器 self.window.rootViewController = nav; // 3. 设置窗口为主窗口并显示窗口 [self.window makeKeyAndVisible]; // 隐藏导航控制器的导航条 nav.navigationBarHidden = YES; return YES; } @end
2. OneViewController类
---------- OneViewController.m文件 #import "OneViewController.h" #import "TwoViewController.h" @interface OneViewController ()<TwoViewControllerDelegate> @property (nonatomic,strong) UITextField *textField; @end @implementation OneViewController - (void)viewDidLoad { [super viewDidLoad]; //设置控制器View的背景颜色 self.view.backgroundColor = [UIColor greenColor]; // 创建点击按钮 UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom]; clickBtn.frame = CGRectMake(10, 100, 80, 40); clickBtn.backgroundColor = [UIColor whiteColor]; [clickBtn setTitle:@"到界面2" forState:UIControlStateNormal]; [clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:clickBtn]; // 创建文本框 _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)]; _textField.borderStyle = UITextBorderStyleRoundedRect; _textField.backgroundColor = [UIColor whiteColor]; [self.view addSubview:_textField]; } #pragma mark - 点击事件 - (void)btnClick { // 创建界面2,并压入栈 TwoViewController *twoVc = [[TwoViewController alloc] init]; [self.navigationController pushViewController:twoVc animated:YES]; // 设置界面2的代理 twoVc.delegate = self; } #pragma mark - 实现代理方法 - (void)twoViewController:(TwoViewController *)vc andString:(NSString *)str { _textField.text = str; } @end
3. TwoViewController类
---------- TwoViewController.h文件 #import <UIKit/UIKit.h> #pragma mark - TwoViewController代理协议 @class TwoViewController; @protocol TwoViewControllerDelegate <NSObject> @optional - (void)twoViewController:(TwoViewController *) vc andString:(NSString *)str; @end #pragma mark - TwoViewController控制器声明 @interface TwoViewController : UIViewController // 代理 @property (nonatomic,weak) id<TwoViewControllerDelegate> delegate; @end ---------- TwoViewController.m文件 #import "TwoViewController.h" @interface TwoViewController () @property (nonatomic,strong) UITextField *textField; @end @implementation TwoViewController - (void)viewDidLoad { [super viewDidLoad]; //设置控制器View的背景颜色 self.view.backgroundColor = [UIColor yellowColor]; // 创建点击按钮 UIButton *clickBtn = [UIButton buttonWithType:UIButtonTypeCustom]; clickBtn.frame = CGRectMake(10, 100, 80, 40); clickBtn.backgroundColor = [UIColor whiteColor]; [clickBtn setTitle:@"传 值" forState:UIControlStateNormal]; [clickBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [clickBtn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [clickBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:clickBtn]; // 创建文本框 _textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 150, 250, 40)]; _textField.borderStyle = UITextBorderStyleRoundedRect; _textField.backgroundColor = [UIColor whiteColor]; [self.view addSubview:_textField]; } #pragma mark - 点击事件 - (void)btnClick { // 通知代理做事情 if ([_delegate respondsToSelector:@selector(twoViewController:andString:)]) { [_delegate twoViewController:self andString:_textField.text]; } // 跳转界面 [self.navigationController popViewControllerAnimated:YES]; } @end
相关文章推荐
- 控制器和视图之间传递数据的几种方式
- iOS开发中视图控制器ViewControllers之间的数据传递
- 控制器之间的数据传递——NSUserDefaults传值
- ios-day13-01(私人通讯录。控制器之间的数据传递、保存密码和自动登录的实现、普通对象的归档、UITableView的局部刷新和向左滑动删除功能等等)
- 控制器之间的数据传递——Block传值
- iOS实现两个控制器之间数据的双向传递
- ASP.NET MVC 之控制器与视图之间的数据传递
- iOS开发中,实现两个控制器之间数据的双向传递
- 视图控制器ViewControllers之间的数据传递
- 《iOS开发笔记—控制器之间数据的双向传递》
- 控制器之间的数据传递——storyboard中控制器的数据传递
- 【iOS7的一些总结】2、视图控制器ViewControllers之间的数据传递(1)
- ios delegate代理,多个/不同/两个view之间传递数据,传递批量数据,多个数据
- 控制器之间的数据传递——通知传值
- 【iOS7的一些总结】3、视图控制器ViewControllers之间的数据传递(2)
- 控制器之间的数据传递——属性传值
- 两个控制器之间的数据传递 (MVC)
- 在不同线程之间传递数据
- 页面之间传递数据方法之一(查询字符串)