代理和 block 传值的使用

//
//  ZYViewController.h
//  BlockTest
//
//  Created by yejiong on 14/11/2.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import <UIKit/UIKit.h>

//1.声明一个 delegate 协议。
@protocol ZYViewControllerDelegate <NSObject>

//声明一个方法用来传值。
//返回值表明传值的结果,如果不关心那么就写 void。
//方法中的参数就是我们需要传的值,如果要传多个值,后面继续追加参数。
- (void)selectedColor:(UIColor* )color;

@end

@interface ZYViewController : UIViewController

//2.声明一个 delegate 属性。
@property (nonatomic, assign) id<ZYViewControllerDelegate> delegate;

@end
//
//  ZYViewController.m
//  BlockTest
//
//  Created by wanglixing on 14/11/2.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import "ZYViewController.h"

@interface ZYViewController ()

@property (nonatomic, retain) NSArray* colors;

@end

@implementation ZYViewController

- (void)dealloc {
    [_colors release];

    [super dealloc];
}

- (void)viewDidLoad {
    self.view.backgroundColor = [UIColor whiteColor];

    //数组包含了所有选项的标题。
    UISegmentedControl* sc = [[UISegmentedControl alloc] initWithItems:@[@"红色", @"绿色", @"蓝色"]];

    sc.frame = CGRectMake(20, 100, 200, 44);

    //使用 UIControlEventValueChanged
    [sc addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];

    [self.view addSubview:sc];

    [sc release];

    self.colors = @[[UIColor redColor], [UIColor greenColor], [UIColor blueColor]];
}

- (void)valueChanged:(UISegmentedControl* )sender {
    NSLog(@"%@", @(sender.selectedSegmentIndex));

    //3.使用 delegate 对象调用协议方法进行传值。
    if ([_delegate respondsToSelector:@selector(selectedColor:)]) {
        //调用方法前需要判断 delegate 是否实现方法。
        [_delegate selectedColor:_colors[sender.selectedSegmentIndex]];
    }
}

@end

//实现代理

//
//  ViewController.m
//  BlockTest
//
//  Created by yejiong on 14/11/2.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import "ViewController.h"
#import "ZYViewController.h"

@interface ViewController () <ZYViewControllerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

  ZYViewController* vc = [[ZYViewController alloc] init];

  5.设置 delegate 属性。
    vc.delegate = self;

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

    [vc release];

}

#pragma mark - ZYViewControllerDelegate

//4.实现协议方法,获取传过来的值。
- (void)selectedColor:(UIColor *)color {
    self.view.backgroundColor = color;
}

@end

使用 Block传值

//
//  ZYBlockViewController.h
//  BlockTest
//
//  Created by yejiong on 14/11/2.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import <UIKit/UIKit.h>

//使用 block 传值分为 4 步。

//1.声明一个 block 类型,返回值表明传值的结果,参数表明传值的数据。
typedef void(^block)(UIColor* color);

@interface ZYBlockViewController : UIViewController

//2.声明一个 block 属性。
@property (nonatomic, copy) block block;

@property (nonatomic, retain) UIColor* selectedColor;

@end
//
//  ZYBlockViewController.m
//  BlockTest
//
//  Created by yejiong on 14/11/2.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import "ZYBlockViewController.h"

@interface ZYBlockViewController ()

@property (nonatomic, retain) NSArray* colors;

@end

@implementation ZYBlockViewController

- (void)dealloc {
    [_colors release];

    [_block release];

    [_selectedColor release];

    [super dealloc];
}

- (void)viewDidLoad {

    self.view.backgroundColor = [UIColor whiteColor];

    //数组包含了所有选项的标题。
    UISegmentedControl* sc = [[UISegmentedControl alloc] initWithItems:@[@"红色", @"绿色", @"蓝色"]];

    sc.frame = CGRectMake(20, 100, 200, 44);

    //使用 UIControlEventValueChanged
    [sc addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];

    [self.view addSubview:sc];

    [sc release];

    self.colors = @[[UIColor redColor], [UIColor greenColor], [UIColor blueColor]];

    NSInteger index = [_colors indexOfObject:_selectedColor];

    if (index != NSNotFound) {
        sc.selectedSegmentIndex = index;
    }
}

- (void)valueChanged:(UISegmentedControl* )sender {
    NSLog(@"%@", @(sender.selectedSegmentIndex));

    //3.调用 block 进行传值。
    if (_block) {
        //调用 block 前需要判断 block 是否实现。
        _block(_colors[sender.selectedSegmentIndex]);
    }
}

@end
//
//  ViewController.m
//  BlockTest
//
//  Created by wanglixing on 14/11/2.
//  Copyright © 2014年 zzz. All rights reserved.
//

#import "ViewController.h"
#import "ZYBlockViewController.h"

@interface ViewController () <ZYViewControllerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    ZYBlockViewController* vc = [[ZYBlockViewController alloc] init];

    //4.实现 block 并获取传过来的值。
    vc.block = ^(UIColor* color){
        //使用 color。
        self.view.backgroundColor = color;

        //写在 push 前,push 后效果都一样,因为是同一个 UINavigationController
//        [self.navigationController popViewControllerAnimated:YES];
    };

    vc.selectedColor = self.view.backgroundColor;

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

    [vc release];
}

@end
时间: 2024-12-15 14:05:15

代理和 block 传值的使用的相关文章

代理和block反向传值

代理传值: // SendViewController.h #import <UIKit/UIKit.h> @protocol SendInFor <NSObject> -(void)sendInForIdea:(NSString*)text; @end @protocol SendInForTwo <NSObject> -(void)sender:(NSString*)text; @end @interface SendViewController : UIViewC

IOS 代理和block的对比

一.block 方法从子视图向父视图传递值. 案例:使用block方式子视图向父视图传值.在子视图.h定义block,定义方法.在.m文件实例化方法.然后再主视图实例化子视图是使用block并传入相应的代码,在子视图点击的 addtarget下执行 父视图的传入的快代码.block这个流程清晰,比代理协议的跳跃性要小. .定义快代码 //在子视图的.h文件中 //定义快代码 typedef void(^textFieldChangedBlock)(NSString *text); - (id)i

使用代理和block写一个alertView

代理: MyAlertView.h: @property (nonatomic,assign)id delegate; @protocol MyAlertViewDelegate <NSObject> - (void)myAlertView:(MyAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; @end MyAlertView.m:- (void)buttonClick:(id)sender { UIButt

JDK动态代理和CGLIB动态代理

转载自http://www.itzhai.com/java-dong-tai-dai-li-zhi-jdk-dong-tai-dai-li-he-cglib-dong-tai-dai-li-mian-xiang-qie-mian-bian-cheng-aop-yuan-li.html 静态代理 静态代理相对来说比较简单,无非就是聚合+多态: 参考:设计模式笔记 – Proxy 代理模式 (Design Pattern) 动态代理 我们知道,通过使用代理,可以在被代理的类的方法的前后添加一些处理方

iOS 页面间传值 之 单例传值 , block 传值

ios 页面间传值有许多,前边已经分享过属性传值和代理传值,今天主要说一下单例传值和 block 传值 单例传值:单例模式一种常用的开发的模式,单例因为在整个程序中无论在何时初始化对象,获取到的都是同一个对象,对象的属性相同,所以可以用来传值. block 传值 与 代理传值相似,主要用于第二个页面向第一个页面传值,block 传值具体步骤: 在第二个页面: 1.声明: block typedef void(^SendMessagerBlock) (NSString *str); 2.创建方法:

属性传值,协议传值,block传值,单例传值四种界面传值方式

一.属性传值 对于属性传值而言,相对于其它的三种 方法来说,是最基础,最简单的一种 方法,但,属性传值 有很大的局限性,因为是适用于第一个界面向第二个界面传 值,第二个向第三个界面传值等等.N界面向N + 1界面传值.而在此基础上,必须知道跳转界面的明确位置及所要传的值的具体类型.在第二个界面中声明所要传值 类型的属性. @interface SecondViewController : UIViewController //声明一个字符串属性来保存第一个界面传过来的字符串内容 @propert

JDK动态代理和CGLIB动态代理+源码下载

在上一篇文章-java代理详解讲解实现机制,一种是继承另外一种是组合,而且通过做实现也证明使用组合的方式更加的灵活.之后提到了代理的两种种类,一种是静态代理,另外一种是动态代理.上一篇文件中着重介绍的是静态代理(相对于动态代理很容易理解).这一片文章就接着介绍动态代理. 动态代理实现的最终效果:通过以一个统一的方式实现对任意的接口/类的代理.相比较静态代理而言,我们可以不用再无限制的增加代理类,不用再写许多重复的代码.很符合面向对象设计原则中的"开闭原则":对修改关闭,对扩展开放. 动

IOS传值--代理传值,block传值,NSNotificationCenter传值

一:利用代理传值,就是利用代理进行通信. 接口文件: #import <Foundation/Foundation.h> @protocol Cdelegate <NSObject> -(void)change:(NSString *)name; @end .h文件 @interface ViewController : UIViewController<Cdelegate> .m文件 - (IBAction)pushBB:(id)sender { BViewContr

block传值

block传值,布布扣,bubuko.com