IOS代理(初级)

协议的作用以及协议的用法

1.协议一般用作两个类之间的通信

2.协议声明了一组所有类对象都可以实现的借口

3.协议用@prltocol关键字声明 它本身不是类

4.参与协议的两个对象,代理者和委托者

5.代理,实现协议的某个方法,实现这个协议

6.委托,用自己的方法指定要实现协议方法的对象(代理),代理来实现对应的方法

7.@required---必须实现的方法  @optional---可以选择的方法  默认@required

例子:

这是一个简单的代理回调,包含传参

// 非正式协议

@protocol BCViewDelegate <NSObject>

// 参数
- (void)BCViewButtonDidClicked:(NSString *)text;

@end

委托类

@interface BCView : UIView
// 写属性代理                                                    
@property(nonatomic,retain)id<BCViewDelegate>delegate;

@end

@implementation BCView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        [self addAllViews];
        
    }
    return self;
}

- (void)addAllViews
{

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.frame = CGRectMake(100, 100, 100, 40);
    // 绑定点击事件
    [button addTarget:self action:@selector(buttonDidClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    [button setTitle:@"测试" forState:UIControlStateNormal];
    
    [self addSubview:button];
    
}

- (void)buttonDidClicked:(UIButton *)send
{

    [self.delegate BCViewButtonDidClicked:@"杨过"];
    
}

@end
代理类:
@interface BCViewController ()<BCViewDelegate>
@property(nonatomic,retain)BCView *rootView;
@end

@implementation BCViewController
- (void)dealloc
{
    [_rootView release];
    [super dealloc];
}

- (void)loadView
{

    self.rootView = [[BCView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view = self.rootView;
    [_rootView release];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    self.rootView.delegate = self;
    
}

- (void)BCViewButtonDidClicked:(NSString *)text
{
    NSLog(@"%@",text);

    NSLog(@"代理实现button点击");
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    if ([self isViewLoaded] && self.view.window == nil) {
        self.view = nil;
    }
}

@end

两个类之间传值,可以用代理也可以不用代理(不实用),复杂的项目中,比如第三个类要得到协议方法的返回值,用代理会比较方便。

可以把代理对象设置为自身,可以在自身中实现协议的方法

 

posted @ 2015-07-03 19:34  百川hl  阅读(149)  评论(0编辑  收藏  举报