- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 200, 100, 50);
[button setTitle:@"123456" forState:UIControlStateNormal];
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (void)buttonAction:(UIButton *)sender
{
// 点击按钮 返回上一个页面 同时通过block 把这个值传到上一个页面
self.block(sender.titleLabel.text);
[self dismissViewControllerAnimated:nil completion:nil];
}
另外:block 还有两个问题
1.怎么改变block里面的值
用上面的代码 在ViewController.m viewDidLoad 里面 添加代码
1.局部变量
定义一个图片名字的Block
*/
// 局部变量
void(^imageNameBlock)(NSString *imageName);
// 如果想修改Block里面的值 需添加__block修饰
// __block UIImage *image;
imageNameBlock = ^(NSString *imageName)
{
image = [UIImage imageNamed:imageName];
self.view.backgroundColor = [UIColor colorWithPatternImage:image];
};
imageNameBlock(@"17.jpg");
就会出现 Use of undeclared identifier 'image' 错误情况 原因是我们试图改变block里面的值 解决办法就是 添加 __block 修饰(解注释
__block UIImage *image;) 就行了
2.block的循环引用
用上面的代码 在ViewController.m viewDidLoad 里面 添加代码
// 全局变量
// block循环 引用 解决 我们用弱引用 __block
__weak ViewController *VC = self;
__block UIImage *image = nil;
imageNameBlock_1 = ^(NSString *imageName)
{
image = [UIImage imageNamed:imageName];
VC.view.backgroundColor = [UIColor colorWithPatternImage:image];
};
UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 100)];
lable.backgroundColor = [UIColor brownColor];
[self.view addSubview:lable];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
[self.view addGestureRecognizer:tap];
再添加两个方法
- (void)loadData
{
imageNameBlock_1(@"17.jpg");
}
- (void)viewWillAppear:(BOOL)animated
{
[self loadData];
}
当出现循环引用是我们用__weak修饰下 但具体机制还不太懂 希望高人指点,感谢大家对ASPKU的支持。
注:相关教程知识阅读请移步到IOS开发频道。










