码迷,mamicode.com
首页 > 其他好文 > 详细

代理和 block 传值的使用

时间:2016-08-14 23:54:02      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

//
//  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

 

代理和 block 传值的使用

标签:

原文地址:http://www.cnblogs.com/ningmengcao-ios/p/5771264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!