- 實現的功能: 在TwoViewcontroller中點擊按鈕調用Viewcontroller的對象方法,將要設置的顏色傳遞給上一個控制器Viewcontroller,并給Viewcontroller中的greenView賦值,實現顏色的改變
- 通過在Viewcontroller的對象方法中調用block并將要傳遞給TwoVIewcontroller的數據寫入block參數中,實現了block回調,由于block實現是在Twoviewcontroller中實現的,則block跳回TwoVIewcontroller中執(zhí)行,將傳進來的參數(顏色)賦值給TwoViewcontroller中的blueView.
- 設置回調的block有返回值,在TwoViewcontroller中定義block的時候返回一個NSString類型的字符串給調用block的ViewController實現數據的第二次回調.回調給VIewcontroller,并設置給VIewcontroller中的label
- 圖片效果如下
01.gif
- 由于是在TwoVIewController中調用的ViewController中的對象方法所以在ViewController中定義對象方法.
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
/**
1.傳遞進來的參數color賦值給greenView
2.設置回調block類型為有返回值(NSString類型),有參數(UIColor類型)的block
*/
-(void)setGreenViewColorWithColor:(UIColor *)color andCallBackBlock:(NSString *(^)(UIColor * color))callBackBlock;
@end
- 在ViewController.m實現此方法
-(void)setGreenViewColorWithColor:(UIColor *)color andCallBackBlock:(NSString * (^)(UIColor *))callBackBlock{
self.greenView.backgroundColor = color;
/**
1.將要傳遞回給TwoViewcontroller的顏色通過調用代碼塊block傳遞回去
2.block在哪里實現就是在哪里調用.
3.將block返回的字符串接受并設置給lblReceive
*/
self.lblReceive.text = callBackBlock(color);
}
- 在TwoViewController中調用上述實現的方法
#import "TwoViewController.h"
#import "ViewController.h"
@interface TwoViewController ()
@property (weak, nonatomic) IBOutlet UIView *blueView;
@end
@implementation TwoViewController
/** 點擊按鈕 */
- (IBAction)clickMe:(id)sender {
/**
1.通過self.navigationController.viewControllers[0]方式獲得跟控制器ViewController
2.注意: 這里有個 "坑" 就是如何獲取上一個控制器對象,只能通過self.navigationController.viewControllers[0] 此方法來獲取
*/
ViewController * vc = self.navigationController.viewControllers[0];
/**
1.調用VIewcontroller對象方法將要設置顏色信息傳遞給ViewsController中的greenView,并設置顏色
*/
[vc setGreenViewColorWithColor:[UIColor redColor] andCallBackBlock:^(UIColor *color) {
/** 將block傳遞回來的color賦值給blueView,實現數據回調 */
self.blueView.backgroundColor = color;
/** 返回一個字符串 */
return @"紅色";
}];
}
- 注意點: 調動ViewController的對象方法,不能用ViewController new 一個對象,然后用new出來的對象調用ViewController中的對象方法是不會給上一個控制器的greenView賦上值的,因為new出來的是一個新的對象跟上一個控制器不是同一個對象.所以在此只能用self.navigationController.viewControllers[0]來實現獲取上一個控制器
整體思路:
- 在TwoViewController中調用ViewController的對象方法,把要設置顏色傳遞過去,實現Viewcontroller中的greenView的顏色改變.
- 通過在ViewController對象方法中調用block,并將要傳遞的參數寫入block的參數中,傳遞給TwoVIewcontroller,然后實現TwoViewcontroller中的blueView的顏色改變
- 通過block的返回值(NSString類型),又將TwoViewcontroller中要傳遞給ViewController的數據傳遞給了ViewController.實現了ViewController中的label的賦值.
- 注意點: 獲取上一個控制器,只能通過self.navigationController.viewControllers[0]來實現
- 分析圖
Paste_Image.png