zoukankan      html  css  js  c++  java
  • ios开发 block语句块

    ios开发 block语句块

    1.block 理解为匿名函数

    2.block变量的定义

        //定义block变量,^表示定义block
        //技巧:函数名左右加括号,在函数名前面在加^
        void (^block)();
        
        //定义block语句块,存储到了block变量中
        block=^void ()
        {
            NSLog(@"I am block");
        };
        
        //执行
        block();

    3.带有参数和返回值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,40);
        NSLog(@"s=%d",s);

    4.block捕获外部外部变量(下面代码的_url和_page 为全局变量)

         //block使用block外面的变量的注意事项
         //int num=10;
        __block int val=100;
        void (^b1)()=^void()
        {
            //能使用和修改实例变量
            _page=1;
            //block中不能修改局部变量的值
            //num++;
            
            //block中能修改__block修饰的局部变量
            val++;
            
            //有可能有警告,因为内存问题引起,注意(用下面的方法)
            //__weak typeof(self) weakSelf = self;//block外面定义
            //weakSelf.url = @"text";
            self.url = @"txt";
        };
        
        b1();

    5.oc 中应用 

    (1)NSMutableArray排序(另外定义一个类Dog继承于NSObject

        Dog *huahua=[[Dog alloc] init];
        huahua.nickName=@"huahua";
        huahua.age=4;
        
        Dog *miao=[[Dog alloc] init];
        miao.nickName=@"miaomiao";
        miao.age=3;
        
        Dog *dahuang=[[Dog alloc] init];
        dahuang.nickName=@"dahuang";
        dahuang.age=5;
        
        NSMutableArray *marr=[[NSMutableArray alloc] initWithArray:@[huahua,miao,dahuang]];
        //marr sortUsingSelector:<#(SEL)#>//(以前用的方法)
        [marr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            Dog *aDog=obj1;
            Dog *bDog=obj2;
            //return aDog.age>bDog.age;//按年龄升序排序
            //按名字排序
            return [aDog.nickName compare:bDog.nickName]<0;
        }];
        
        for(Dog *d in marr)
        {
            NSLog(@"name = %@ , age = %d",d.nickName,d.age);
        }

    (2)UIView动画

        UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
        label.text=@"我是label";
        label.backgroundColor=[UIColor redColor];
        [self.view addSubview:label];
        
        //向下移动200
        [UIView animateWithDuration:2 animations:^{
            CGRect frame=label.frame;
            frame.origin.y+=200;
            label.frame=frame;
        } completion:^(BOOL finished) {
            NSLog(@"动画结束");
            label.transform=CGAffineTransformMakeRotation(M_PI);
            [UIView animateWithDuration:2 animations:^{
                CGRect frame=label.frame;
                frame.origin.y-=200;
                label.frame=frame;
            } completion:^(BOOL finished) {
                
            }];
        }];

    6.block实现界面反向传值

    创建一个视图类SecondViewController继承于UIViewController

    (1)在SecondViewController.h文件定义下面的方法

    //为了给第二个界面传入block
    -(void)setChangeBackgroundColor:(void (^)(NSString *color)) action;

    (2)在SecondViewController.m文件实现下面的方法

     
    -(void)btnClick
    {
        //改变主界面的颜色
        if (_action) {
            _action(@"blue");
        }
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }

    (3)在UIViewController视图实现下面方法

    -(void)btnClick
    {
        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实现界面反向传值(这里传的是视图背景颜色)

  • 相关阅读:
    第二次冲刺 站立会议7
    第二次冲刺 站立会议6
    第二次冲刺 站立会议5
    第二次冲刺 站立会议4
    第二次冲刺 站立会议3
    第二次冲刺 站立会议2
    第二次冲刺 站立会议1
    第一次冲刺 站立会议9
    第一次冲刺 站立会议8
    第一次冲刺 站立会议7
  • 原文地址:https://www.cnblogs.com/DWdan/p/4399171.html
Copyright © 2011-2022 走看看