iOS传值之代理传值

iOS中传值方式有好几种,分别是:代理传值,block传值,属性传值,通知传值,单例传值,利用userdefault或者文件方式传值,通常代理传值和block传值使用最普遍,本文介绍代理传值的方式,后续博客会一次写上其他传值方式。

一 什么是委托代理?

1、协议(protocol),就是使用了这个协议后,必须按照协议规定的内容来处理事情,协议中要求的方法必须实现(@optional的方法除外)。

protocol是一种语法,它提供了一个很方便的、实现delegate模式的机会。

定义protocol如下:

  1. @protocol ClassBDelegate<NSObject>
  2. - (void)methodOne;
  3. @optional
  4. - (void)methodTwo:(NSString *)value;
  5. @end

定义了一个ClassB的协议,这个协议中包含两个方法,其中methodTwo为可选的。

在ClassA的头文件(ClassA.h)中实现这个协议,如下代码:

  1. @interface ClassA<ClassBDelegate>
  2. @end

在ClassA的实现文件(ClassA.m)中实现ClassBDelegate的两个方法,其中methodTwo可以不实现,如下:

  1. - (void)methodOne{
  2. // 具体实现内容
  3. }
  4. - (void)methodTwo:(NSString *)value{
  5. // 具体实现内容
  6. }

2、代理(delegate),顾名思义就是委托别人办事,当一件事情发生后,自己不处理,让别人来处理。

delegate和protocol没有关系。delegate本身是一种设计模式。是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。

在ClassB的头文件(ClassB.h)中定义一个代理如下:

  1. @interface ClassB
  2. @property (nonatomic, unsafe_unretained) id<ClassBDelegate> delegate;
  3. @end

这样,当我们在ClassB的实现文件(ClassB.m)中遇到想让别的类(如 ClassA)处理的问题时,就可以这样

  1. [self.delegate methodOne];
  2. [self.delegate methodTwo:@"需要传递的值"];

二  具体实例

   实现的功能是:在viewcontroller中创建一个UIButton按钮用于push到下一个页面,和一个UILable用于显示从第二个页面传回的文字,在secondviewcontroller中创建一个UITextfield用于输入文字。在输入完成按下back返回第一个页面后,在lable上显示输入的文字。

1 工程截图

2  ViewController.h文件

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

3  ViewController.m文件

#import "ViewController.h"

#import "SecondViewController.h"

@interface ViewController ()<getTextFromDelegate>

{

UIButton *_button;

UILabel *_lable;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self initLayout];

}

- (void)initLayout{

_button = [UIButton buttonWithType:UIButtonTypeSystem];

_button.frame = CGRectMake(0, 0, 100, 50);

_button.center = self.view.center;

_button.backgroundColor = [UIColor redColor];

[_button addTarget:self action:@selector(pushToNextViewController:) forControlEvents:UIControlEventTouchUpInside];

[_button setTitle:@"下一页" forState:UIControlStateNormal];

[self.view addSubview:_button];

_lable = [[UILabel alloc]initWithFrame:CGRectMake(10, 64, 355, 200)];

_lable.backgroundColor = [UIColor orangeColor];

[self.view addSubview:_lable];

}

- (void)pushToNextViewController:(UIButton *)sender{

SecondViewController *secondVC = [SecondViewController new];

//代理就是本身

secondVC.delegate = self;

[self.navigationController pushViewController:secondVC animated:YES];

}

#pragma mark 实现代理方法

- (void)getText:(NSString *)text{

_lable.text = text;

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

4  SecondViewController.h文件

#import <UIKit/UIKit.h>

@protocol getTextFromDelegate <NSObject>

//声明协议方法

- (void)getText:(NSString *)text;

@end

@interface SecondViewController : UIViewController

@property (weak, nonatomic)id<getTextFromDelegate>delegate;

@end

4  SecondViewController.m文件

#import "SecondViewController.h"

@interface SecondViewController ()<getTextFromDelegate>

{

UITextField *_textField;

}

@end

@implementation SecondViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

_textField = [[UITextField alloc]initWithFrame:CGRectMake(0, 0, 200, 50)];

_textField.backgroundColor = [UIColor redColor];

_textField.center = self.view.center;

[self.view addSubview:_textField];

}

#pragma mark 在页面将要消失时

- (void)viewWillDisappear:(BOOL)animated{

//将本页面获取的值传递给上一个页面去实现

[self.delegate getText:_textField.text];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

三  模拟器运行结果截图

时间: 2024-10-13 21:25:50

iOS传值之代理传值的相关文章

iOS 页面跳转传值,属性传值,代理传值,代码块传值,单例传值,通知传值

有时候我们在页面跳转的时候回传递相应的参数,如,你想把在第一个页面的文本框里的内容显示在第二个文本框中,或者你又想把第二个文本框中的内容改变之后到第一个页面的文本框中,所有,这个时候我们就要用到页面跳转传值 1.属性传值(正向传值) 属性传值是正向传值,只可以从前面一个页面传递到第二个页面,不可以从第二个页面传递到第一个页面 2.代理传值(逆向传值) 代理传值是逆向传值 代理传值步骤 代理传值 适用于 反向传值 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewControll

界面通信之属性传值、代理传值

界面通信有三种方法 1.属性传值 2.代理传值 3.blcok传值 先讲讲属性和传值和代理传值 //属性传值- (void)sendValue { SecondViewController *secondVC = [[SecondViewController alloc] init]; secondVC.string = _textField.text;//这句是属性传值的核心,在需要接收值的界面声明一个字符串属性接受值 secondVC.color = self.view.background

iOS中多视图的传值 属性传值和代理传值

首先创建两个类 ,FirstViewController和SecondViewController,都继承于UIViewController 1 #import "AppDelegate.h" 2 #import "FirstViewController.h" 3 4 @interface AppDelegate () 5 6 @end 7 8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIAp

属性传值和代理传值的步骤

//属性传值:最常用的传值方式 /** * 操作过程: 1.在第二个页面.h文件中书写属性 (设置那个传值属性) 2.就在第一个页面创建第二页控制器的方法里面,进行赋值操作 3.适用性(局限性): 仅仅适用于第一个页面传值到下一个页面 */ /** * 代理传值 操作过程 1.在第二级控制器.h文件中,设置非正式协议(方法必须带参数) 2.在第二级控制器.h文件中写属性 3.在第二级控制器.m文件中,利用代理属性,去调用协议里面的方法(同时把参数传出来) 4.在第一级控制器中遵守协议 5.在第一

IOS pop使用代理传值

假如oneViewController页面push到OtherViewController页面,然后你想从OtherViewController页面pop到oneViewController页面的时候需要传值,这时可以使用代理. 从OtherViewController中.h文件中定义代理,并设置代理属性,代码如下 #import <UIKit/UIKit.h> @protocol OneDelegate - (void)returnName:(NSString *)name; @end @i

iOS基础控件-UINavigationController 中的传值,代理传值,正向传值,反向传值

/* 程序过程: 1,创建一个根视图,一个二级视图 2,根视图 NavigationItem.title = Root  二级视图NavigationItem.title = Second 根视图NavigationItem.rightButton 入栈二级视图 3, 二级视图中创建三个按钮 按钮一  按钮二  按钮三 三个按钮点击时间都是出栈,并把自己的按钮的 titel 赋给 根视图的NavigationItem.title 4,当再次进入二级视图时,判断 根视图的NavigationIte

iOS 闭包传值 和 代理传值

let vc = ViewController() let navc = UINavigationController(rootViewController: vc) window = UIWindow(frame: UIScreen.mainScreen().bounds) window?.backgroundColor = UIColor.whiteColor() window?.rootViewController = navc window?.makeKeyAndVisible() //

block传值和代理传值的异同点

delegate:1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理:2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始.是否收到了数据.数据是否已经接受完成.数据接收失败 block:1:写法更简练,不需要写protocol.函数等等2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息3,block需要注意防止循环引用

iOS 页面间传值 之 属性传值,代理传值

手机 APP 运行,不同页面间传值是必不可少,传值的方式有很多(方法传值,属性传值,代理传值,单例传值) ,这里主要总结下属性传值和代理传值. 属性传值:属性传值是最简单,也是最常见的一种传值方式,但其具有局限性(一般用于将第一个页面的值传递到第二个页面,但无法从第二个页面传到第一个页面), 向SecondViewController传值:SecondViewController 设置属性 sendMessage 1 - (void)rightButtonAction:(UIBarButtonI