iOS学习笔记(十一)————代理

/ 0评 / 0

前面我们在使用一些控件的时候我们设置了一个属性 delegate ,这个属性在iOS的开发中还是很重要的,这里涉及到的其实是一种设计模式---代理模式。
比如一个弹框AlertView,我们需要根据用户选择的按钮来做出相应的操作,但是按钮是在AlertView上的,而我们的操作是在弹框弹出来之前的页面上进行的,我们该怎么处理呢?这里我们就用到了代理,在创建这个AlertView的时候我们把之前的ViewController作为一个属性传递到AlertView中去,根据系统中设定的一些方法来对这个页面进行操作,而AlertView里面是有一个叫做delegate的属性的,但是我们这里是不知道传来的对象到底是什么类型的,所以这个delegate的类型是id类型,而想做一些操作的类就可以实现AlertView的代理方法就可以对页面进行操作了,下面看一个delegate的实现例子。

这里是头文件

//这里是自己写的一个AlertView
@interface MyAlertView : UIView
//这个就是代理的属性
@property id delegate;

- (void)show;
@end

//声明一个协议方法

//protocol 协议
@protocol MyAlertViewDelegate 
//这里传递了两个参数  1.是对象  2.是按钮的tag值
- (void)alertView:(MyAlertView*)alertView doSomethingClickBtnAtIndex:(NSInteger)btnIndex;
@end

下面就是实现的文件:

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        
        self.frame = CGRectMake(0, 0, 200, 200);
        self.backgroundColor =  [UIColor purpleColor];
        
        UILabel *lab = [[UILabel alloc] initWithFrame:CGRectMake(50, 20, 100, 30)];
        lab.backgroundColor = [UIColor redColor];
        [self addSubview:lab];
        
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        btn.frame = CGRectMake(0, 100, 100, 100);
        [btn setTitle:@"取消" forState:UIControlStateNormal];
        btn.tag = 1;
        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:btn];
        
        
        
        UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeCustom];
        btn1.frame = CGRectMake(100, 100, 100, 100);
        [btn1 setTitle:@"改变" forState:UIControlStateNormal];
        btn1.tag = 2;
        [btn1 addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:btn1];
        
    }
    return self;
}

- (void)btnClick:(UIButton *)btn{
    
//    self.delegate 来获得谁传递过来的对象
//    有对象去调用协议方法
    [self.delegate alertView:self doSomethingClickBtnAtIndex:btn.tag];
   

    [self removeFromSuperview];
//    问题1.获取对象
    
//    通过属性来传递对象
    
//    问题2. 点击按钮的方法是固定的,所以点击所有的alertview都会执行此方法   会造成不必要的麻烦  会出现混乱
    
//    解决办法  声明协议方法  找到对象后谁想去做什么 只需要将对象传递过来  就可以在自己类中去实现协议方法
//    self.delegate
}

- (void)show{
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    self.center = window.center;
    
    [window addSubview:self];
}

下面我们看一下怎么使用这个代理

    @interface DCViewController () 
    @end


    - (void)changeColor:(id)sender {
        MyAlertView *alert = [[MyAlertView alloc] init];
        alert.delegate = self; //先设置代理,然后在头文件上定义要实现的代理
       [alert show];
    }

    //然后去实现代理方法
    - (void)doSomething:(FXDAlertView *)alertView clickBtnAtIndex:(NSInteger)btnIndex{
     if (btnIndex == 1) {
         return;
     }
     if (btnIndex == 2) {
          self.view.backgroundColor = [UIColor greenColor];
     }
   }

这里也实现了自定义弹框,而且比之前的方法更简单易用~

代码请查看 http://git.oschina.net/zcb1603999/LearningiOS

评论已关闭。