代理跟block

代理传值:在第二个界面输入值传给第一个界面

MainViewController

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController

@property (nonatomic, retain) UITextField *labelTwo;
@end

#import "MainViewController.h"
#import "OtherViewController.h"
@interface MainViewController ()<OtherViewDelegate>
{
  NSString *_str;
}
@end

@implementation MainViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
    self.view.backgroundColor = [UIColor whiteColor];
  }
  return self;
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view.
  _labelTwo = [[UITextField alloc]initWithFrame:CGRectMake(160, 200, 70, 44)];
  _labelTwo.backgroundColor = [UIColor grayColor];
  [self.view addSubview:_labelTwo];

  UIButton *buttonTow = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [buttonTow setTitle:@"推" forState:UIControlStateNormal];
  buttonTow.frame = CGRectMake(160,100, 70, 44);
  [self.view addSubview:buttonTow];
  [buttonTow addTarget:self action:@selector(tuiPush) forControlEvents:UIControlEventTouchUpInside];
}

- (void)tuiPush
{
  OtherViewController *view = [[OtherViewController alloc] init];
  view.delegate = self;
  [self.navigationController pushViewController:view animated:YES];
}

- (void)OtherViewLabel:(UITextField *)labelOne
{
  _labelTwo.text = labelOne.text;
}

第二个界面:OtherViewController

#import <UIKit/UIKit.h>
@protocol OtherViewDelegate<NSObject>

- (void)OtherViewLabel:(UITextField *)labelOne;

@end

@interface OtherViewController : UIViewController

@property (nonatomic, retain) UITextField *labelOne;
@property (nonatomic, weak)id<OtherViewDelegate>delegate;
@end

#import "OtherViewController.h"

@interface OtherViewController ()

@end

@implementation OtherViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
  }
  return self;
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view.

  _labelOne = [[UITextField alloc]initWithFrame:CGRectMake(160, 200, 70, 44)];
  _labelOne.backgroundColor = [UIColor grayColor];
//	_labelOne.text = @"21312";
  [self.view addSubview:_labelOne];

  UIButton *buttonOne = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [buttonOne setTitle:@"传递" forState:UIControlStateNormal];
  buttonOne.frame = CGRectMake(160,100, 70, 44);
  [self.view addSubview:buttonOne];
  [buttonOne addTarget:self action:@selector(delegateM) forControlEvents:UIControlEventTouchUpInside];
}

- (void)delegateM
{
  [_delegate OtherViewLabel:_labelOne];

  [self.navigationController popViewControllerAnimated:YES];
}

- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

下面是Block 传值  实现相同的功能

MainViewController

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController
@property (nonatomic, retain) UITextField *labelTwo;

@end
#import "MainViewController.h"
#import "OtherViewController.h"
@interface MainViewController ()

@end

@implementation MainViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
  }
  return self;
}

- (void)viewDidLoad
{
  [super viewDidLoad];

  _labelTwo = [[UITextField alloc]initWithFrame:CGRectMake(160, 200, 70, 44)];
  _labelTwo.backgroundColor = [UIColor grayColor];
  [self.view addSubview:_labelTwo];

  // Do any additional setup after loading the view.
  UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  btn.frame = CGRectMake(160, 100, 100, 44);
  [btn setTitle:@"chuan" forState:UIControlStateNormal];
  [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:btn];
}

- (void)btnClick
{
  OtherViewController *other = [[OtherViewController alloc] init];
  [other showTextFieldUsingBlock:^(UITextField *textOne) {
    _labelTwo.text = textOne.text;
  }];

  [self.navigationController pushViewController:other animated:YES];
}

第二个界面 :OtherViewController

#import <UIKit/UIKit.h>
typedef void (^MyBlock)(UITextField *textOne);

@interface OtherViewController : UIViewController
@property (nonatomic, retain)UITextField *textOne;
@property(nonatomic, strong) MyBlock block;
- (void)showTextFieldUsingBlock:(MyBlock)block;
@end

#import "OtherViewController.h"

@interface OtherViewController ()

@end

@implementation OtherViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
  }
  return self;
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view.

  _textOne = [[UITextField alloc]initWithFrame:CGRectMake(160, 200, 70, 44)];
  _textOne.backgroundColor = [UIColor grayColor];
  //	_labelOne.text = @"21312";
  [self.view addSubview:_textOne];

  UIButton *buttonOne = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [buttonOne setTitle:@"传递" forState:UIControlStateNormal];
  buttonOne.frame = CGRectMake(160,100, 70, 44);
  [self.view addSubview:buttonOne];
  [buttonOne addTarget:self action:@selector(clickBtn) forControlEvents:UIControlEventTouchUpInside];
}

- (void)showTextFieldUsingBlock:(MyBlock)block
{
  self.block = block;
}

- (void)clickBtn
{
  if (self.block) {
    self.block(_textOne);
  }
  [self.navigationController popViewControllerAnimated:YES];
}
时间: 2024-10-13 22:56:29

代理跟block的相关文章

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

iOS 页面间几种传值方式(属性,代理,block,单例,通知) 姜糖水 2015-05-03 52 阅读 iOS 移动开发 第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五

iOS 代理与block 逆向传值 学习

一般在项目中出现逆向传值的时候就需要用到代理.block 或者通知中心了.由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理.但是最近遇到了一个特别的情况就需要自己处理一下了,之前也在网上看了一下关于如何选择代理.block 或者通知中心.个人感觉代理和通知中心都比较简单,block稍为有点复杂.代理大家都会用,所以当时就选用了通知中心来处理.之后有一次公司的网实在太差了,出现了逆传数据失败的情况,引起了我的注意,打上断点之后才发现,通知中心的那个方法完全没有

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

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五种传值方式: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootVie

iOS协议、代理、Block和回调、类别

[协议](Protocol) //协议是用来规范接口,实现对象间交互的一种机制.类似于JAVA中的接口,可以模拟. 协议的权限 @optional//可选的 @required//必须的 [代理] 一.代理的概念 [注]代理是实现两个类的对象间通信的一种机制. [委托方]主动方 持有带协议的id指针,可以使用协议. [代理方]被动方 遵从协议,实现方法. 代理回调(反向传值) //当我们需要完成某个功能模块,但不知道使用功能模块的是哪个对象,通过协议,可以规定接收数据的对象通过哪个方法获得数据.

iOS-QQ好友列表 iOS 页面间几种传值方式(属性,代理,block,单例,通知)

主要是 点击按钮实现下拉 刷新数据 页面间传值 // // HMFriendsModel.h // QQ好友列表 // // Created by YaguangZhu on 15/9/1. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <Foundation/Foundation.h> @interface HMFriendsModel : NSObject @property(nonatomic,cop

iOS传值方式:属性,代理,block,单例,通知

第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视图控制器的部分信息 例如:第一个界面中的lable显示第二个界面textField中的文本 这就需要使用代理传值 页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五种传值方式: (一)属性传值 第二个界面中的lable显示第一个界面textField中的文本 首先我们建立一个RootView

代理与Block

在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大家真正领略代理的奥妙.写的有点多,但都是干货,我能写下去,不知道你有没有耐心看下去.本人能力有限,如果文章中有什么问题或没有讲到的点,请帮忙指出,十分感谢! iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通知中心进行消息接收和消息广播,

iOS开发——代理与block传值

一.代理传值的方法 1.Hehe1ViewController.h中 #import <UIKit/UIKit.h> @protocol Hehe1ViewControllerDelegate <NSObject> - (void)backValueWith:(NSString*)str; @end @interface Hehe1ViewController : UIViewController @property(nonatomic,weak) id delegate; @en

通知,代理,block 单例的使用和区别

区别 1.NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知: 2.delegate 代理委托: 1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理: 2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始.是否收到了数据.数据是否已经接受完成.数据接收失败 3.block(闭包) block和delegate一样,一般都是“一对一”之间通信交互,相比代理bl