之前写的是第一次发,格式看着太别扭了,重新发
//block:从后一个页面向前一个页面传值;
//步骤:
//1.数据的发送方创建block属性; typedef block, 创建block属性;
//2.发送方定义一个方法,方法的参数是block类型, 方法的实现对block进行赋值;
//3.发送方在某个时刻, 执行block, 并进行数据传递;
//4.接收方,调用方法;
//注:block的属性用copy修饰, block创建在栈区, 为了保证block能够使用, copy将栈区的block拷贝到堆区;
传值页面.h
<span style="font-size:24px;">#import <UIKit/UIKit.h>
typedef void (^BlockType)(NSString *string);
@interface DetailViewController : UIViewController
//block写属性用copy;
//void (^)(NSString *string) 类型名; blockName 参数名;
@property (nonatomic, copy) BlockType blockName;
- (IBAction)valueButton:(UIButton *)sender;
- (void)sendValue:(BlockType)aBlock;
@end</span>
传值页面.m
#import "DetailViewController.h"
#import "ViewController.h"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)dealloc
{
self.blockName = nil;
[super dealloc];
}
- (IBAction)valueButton:(UIButton *)sender {
//执行block
_blockName(@"HelloWorld");
//返回上一个界面;
[self.navigationController popViewControllerAnimated:YES];
}
- (void)sendValue:(BlockType)aBlock{
_blockName = aBlock;
}
被传值页面.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (retain, nonatomic) IBOutlet UILabel *valueLabel;
@end
被传值页面.m
#import "ViewController.h"
#import "DetailViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
DetailViewController *detailVC = (DetailViewController *)[segue destinationViewController];
//block中不能够出现self, 会造成循环引用,
//当在mrc(手动内存管理)下
__block ViewController *blockSelf = self;
// //当在arc(自动内存管理)下
// __weak ViewController *weakSelf = self;
[detailVC sendValue:^(NSString *string) {
NSLog(@"%@", string);
blockSelf.valueLabel.text = string;
}];
}
- (void)dealloc {
[_valueLabel release];
[super dealloc];
}