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

 

posted on 2015-04-07 19:27  卡丁车h  阅读(405)  评论(0编辑  收藏  举报

导航