首页 > 学院 > 开发设计 > 正文

IOS开发之Block

2019-11-14 19:13:59
字体:
来源:转载
供稿:网友

IOS开发之Block

1.什么是block,block的作用

  UI开发和网络常见功能实现回调,按钮的事件处理方法是回调方法,网络下砸后的回调处理

  (1)按钮target-action  一个方法传入按钮中

  (2)表格视图   传入一个指针self,回调视图控制器重的方法

  (3)block   语句块,解决回调,理解为“匿名函数”,这个函数定义在方法里面

 

2.block的基本使用(语法)

  定义block变量

  定义block语句块

//block 理解匿名函数    //void func()    //{    //}        //1.block变量的定义    //技巧:   语法诡异带来男鞋的问题    //void func();        //定义block变量,^表示定义block    //技巧:  函数名左右家括号,在函数名前面加^    void (^block)();        //定义block语句块,存储到block变量中    block = ^void ()    {        NSLog(@"I am block");    };        //执行    block();

  block参数和返回值

 //2.带有参数和返回值block    //实例    实现计算两数之和block//    int myAdd(int x ,int y);        int (^myAdd)(int x ,int y) = ^int (int x ,int y)    {        return x+y;    };    int s = myAdd(10,20);    NSLog(@"s = %d",s);

 

  block捕获外部变量

  block的注意事项

@interface ViewController (){    int _page;}@PRoperty (copy,nonatomic) NSString *url;@end //3.block是捕获外部变量    //  block使用block外面的变量的注意事项        int num = 10;    __block int val = 100;    void (^bbbb)() = ^void()    {        //能使用和修改实例变量        _page = 1;                // block中不能修改局部变量的值,但可以使用        //num++;                //block中能修改__block修饰的局部变量        val++;                //有可能有警告,因为内存问题引起,注意//        __weak typeof(self) weakSelf = self;//        weakSelf.url = @"text";        self.url = @"text";            };    bbbb();

 

3.block在开发中应用(OC,UI,网络)

1.NSMutableArray排序

2.UIView动画

3.block实现界面反向传值

-(void)blockDelelopApply{    //oc中的应用    //1.NSMutableArray排序        Dog *ahua = [[Dog alloc]init];    ahua.nikeName = @"ahua";    ahua.age = 4;        Dog *amiao = [[Dog alloc]init];    amiao.nikeName = @"amiao";    amiao.age = 3;        Dog *dahuang = [[Dog alloc]init];    dahuang.nikeName = @"dahuang";    dahuang.age = 5;        NSMutableArray *marr = [[NSMutableArray alloc]initWithArray:@[ahua,amiao,dahuang]];    //marr sortUsingSelector:<#(SEL)#>    [marr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {        Dog *aDog = obj1;        Dog *bDog = obj2;//        return aDog.age > bDog.age;        return [aDog.nikeName compare:bDog.nikeName] > 0;    }];        for (Dog *d  in marr) {        NSLog(@"name = %@,age = %d",d.nikeName,d.age);    }        //2.UIView动画    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 200, 100, 100)];    label.text = @"kkkk";    label.backgroundColor = [UIColor redColor];    [self.view addSubview:label];        //向下移动200//    [UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>]    [UIView animateWithDuration:2 animations:^{        CGRect frame = label.frame;        frame.origin.x +=200;        label.frame = frame;    } completion:^(BOOL finished) {        NSLog(@"finish");                [UIView animateWithDuration:1 animations:^{            label.transform = CGAffineTransformMakeRotation(M_PI);        } completion:^(BOOL finished) {            [UIView animateWithDuration:2 animations:^{                label.frame = CGRectMake(10, 200, 100, 100);                label.transform = CGAffineTransformMakeRotation(M_PI);            }];                    }];    }];        //3.block实现界面反向传值        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];    button.frame = CGRectMake(0, 20, 320, 10);    [button setTitle:@"change" forState:UIControlStateNormal];    [button addTarget:self action:@selector(buttonact:) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:button];    }-(void)buttonact:(UIButton *)but{    SecondViewController *svc = [[SecondViewController alloc]init];        //设置block    [svc setChangeBackGroundColor:^(NSString *color) {        if ([color isEqualToString:@"blue"]) {            self.view.backgroundColor = [UIColor blueColor];        }    }];                [self presentViewController:svc animated:YES completion:nil];}

  反向传值:

    使用block实现界面传值

    若有两个界面A界面, B界面, A界面创建B界面, B界面值传递到A界面

    A界面设置block,B界面保存block

      a.在第二个界面定义block

//为了给第二个界面传入block-(void)setChangeBackGroundColor:( void (^)(NSString *color) )action;//@property (nonatomic,copy) setChangeBackGroundColor ( void (^__)(NSString *__color) );

      b.第二个界面实现block

@interface SecondViewController (){    //定义block变量,为了保存传入的参数    void (^_action)(NSString *color);}@end@implementation SecondViewController-(void)setChangeBackGroundColor:(void (^)(NSString *))action{    _action = action;}

      c.第二个界面给block赋值

 //改变住界面的颜色    if (_action) {        _action(@"blue");    }

      d.第一个界面设置block

    SecondViewController *svc = [[SecondViewController alloc]init];

//设置block    [svc setChangeBackGroundColor:^(NSString *color) {        if ([color isEqualToString:@"blue"]) {            self.view.backgroundColor = [UIColor blueColor];        }    }];

    [self presentViewController:svc animated:YES completion:nil];

 

代码下载


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表