IOS之block
IOS之block
1.block
回调(按钮的处理事件,网络下载后的回调处理)
(1)按钮target-action 方法传入按钮中
(2)表格视图 传入self指针
(3)block 语句块,解决回调
2.block语句
//1.block变量的定义 //技巧:语法诡异 //定义block -->类似 void (*func)(); 函数指针 void (^block)(); //定义语句块 () block = ^void (){ //定义block语句块-->存到block变量中 NSLog(@"I am a block"); }; block(); //执行 //2. eg:计算两数之和 int myAdd(int a,int b); int (^myAdd) (int a,int b) = ^int(int a,int b){ return a+b; }; int sum = myAdd(10,30); NSLog(@"sum = %d",sum); //3.block捕获外部变量 --> 不能修改局部变量的值 ,可以使用和修改实例变量 // __block int a;(外部变量) // int num = 10; __block int value = 100; void (^b1)() = ^void(){ _page = 1; value++; // num++; //error //可能有警告,因内存问题,注: // __weak typeof(self) weakSelf = self; //block外定义 // weakSelf.url = @"text"; self.url = @"text"; //相互引用造成的内存问题 }; b1();
3.block应用
(1)NSMutableArray排序
#import "Dog.h"
//oc应用 //1.NSMutableArray排序 Dog *ahua = [[Dog alloc] init]; ahua.nickName = @"ahua"; ahua.age = 4; Dog *amiao = [[Dog alloc] init]; amiao.nickName = @"amiao"; amiao.age = 3; Dog *dahuang = [[Dog alloc] init]; dahuang.nickName = @"dahuang"; dahuang.age = 5; NSMutableArray *muarr = [[NSMutableArray alloc] initWithArray:@[ahua,amiao,dahuang]]; [muarr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { Dog *adog = obj1; Dog *bdog = obj2; //return adog.age > bdog.age; return [adog.nickName compare:bdog.nickName]; //按nickName排 }]; for(Dog *dog in muarr){ NSLog(@"name = %@,age = %d",dog.nickName,dog.age); }
(2)UIView动画
//2.UIView动画 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; label.text = @"I am a label"; label.backgroundColor = [UIColor redColor]; [self.view addSubview:label]; [UIView animateWithDuration:2 animations:^{ CGRect rect = label.frame; rect.origin.y += 200; label.frame = rect; } completion:^(BOOL finished) { //可嵌套 NSLog(@"结束动画"); [UIView animateWithDuration:2 animations:^{ label.transform = CGAffineTransformMakeRotation(M_PI); //旋转180 } completion:^(BOOL finished) { }]; }];
(3)反向传值
#import <UIKit/UIKit.h> @interface SecondViewController : UIViewController //void action(NSString *color); //void (^action)(NSString *color); -(void)setChangeBackgroundColor:(void(^)(NSString *color))action; @end
#pragma mark - -(void)setChangeBackgroundColor:(void (^)(NSString *))action{ _action = action; } #pragma mark - - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //反向传值 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(100, 200, 100, 30); //根据实际调 [btn setTitle:@"返回" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; } -(void)btnClick:(UIButton *)btn{ if(_action){ _action(@"blue"); //逆向传值 } [self dismissViewControllerAnimated:YES completion:nil]; }
在第一个ViewConreoller接收
-(void)btnClick:(UIButton *)btn{ SecondViewController *svc = [[SecondViewController alloc] init]; svc.view.backgroundColor = [UIColor yellowColor]; [svc setChangeBackgroundColor:^(NSString *color) { if([color isEqualToString:@"blue"]){ self.view.backgroundColor = [UIColor blueColor]; } }]; [self presentViewController:svc animated:YES completion:nil]; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。