IOS-協議和代理

協議和代理
IOS中協議和代理是很常見的,可是確定有不少人看他感受挺麻煩的,因此就不想去碰他,不過,你要知道協議和代理會解決一些ios沒法解決的問題(論其重要性)。

什麼是協議和代理
簡單一點來講就是頁面之間的傳值,當頁面A跳轉到頁面B(可能會附帶參數,這不影響),或者是頁面B將數據返回給頁面A.【代理模式(協議和代理者)是一種設計
模式,原理是經過一個統一的模式,也能夠理解爲裝在一個盒子裏面。協議定義一組方法,由某一個類負責實現;代理者做爲某個類的一個屬性,一般是另外一個類的實例
對象、能夠負責完成原來那個類很差解決的問題】。代理自己就是一個屬性而已,代理的使用每每配合着協議。可能這個類那個類把大家都弄糊塗了,那麼咱們下面就來看看咱們如何去使用他,這也是方便咱們去了解這個模式的真正用途。

如何使用代理
在這裏必需要提一下,咱們在練習的時候怎麼去用他都沒事,要是在真正項目中,兩個頁面簡單跳轉傳值也用這個代理,說實話,確實有點過了。在頁面B中定義
個協議,聲明ー個代理對象。在頁面A中,將本身設置爲頁面B的代理而且完成代理方法。

何時使用代理
當一個對象沒法直接獲取到另外一個對象的指針,但願對那個變量進行一些操做,即可使用代理模式。

話很少說,直接看事例:
eg:tableView上Switch,在點擊Switch獲取Switch的BOOL值。ios

TableViewCell.h:測試

#import <UIKit/UIKit.h>

//新建一個協議,協議的名字通常是由「類名+Delegate」
@protocol ViewControllerDelegate <NSObject>

//代理傳值方法
-(void)getSwitchIndex:(int)index AndSwitchIsOpen:(BOOL)isOpen;

@end

@interface TableViewCell : UITableViewCell

//委託代理人,代理通常須要使用弱引用(weak)
@property (weak,nonatomic) id<ViewControllerDelegate>delagate;

@property (strong,nonatomic) UIImageView *IconImage;
@property (strong,nonatomic) UILabel *nameLab;
@property (strong,nonatomic) UILabel *newsInfoLab;
@property (strong,nonatomic) UISwitch *switchs;

@property int num;

@end

TableViewCell.m:atom

#import "TableViewCell.h"
#define ScreenWidth [[UIScreen mainScreen] bounds].size.width

@implementation TableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
    UIFont *newFont = [UIFont fontWithName:@"Arial" size:16.0];
    UIFont *newFonts = [UIFont fontWithName:@"Arial" size:14.0];
    
    _IconImage = [[UIImageView alloc]initWithFrame:CGMakeRects(12, 6, 40, 40)];
    _IconImage.layer.masksToBounds = YES;
    _IconImage.layer.cornerRadius = _IconImage.frame.size.height/2;
    [self addSubview:_IconImage];
    
    _nameLab = [[UILabel alloc]initWithFrame:CGMakeRects(65, 5, 100, 20)];
    _nameLab.font = newFont;
    [self addSubview:_nameLab];
    
    _newsInfoLab = [[UILabel alloc]initWithFrame:CGMakeRects(65, 28, 200, 20)];
    _newsInfoLab.font = newFonts;
    _newsInfoLab.textColor = [UIColor grayColor];
    [self addSubview:_newsInfoLab];
    
    _switchs = [[UISwitch alloc]initWithFrame:CGMakeRects(250, 5, 50, 20)];
    [_switchs addTarget:self action:@selector(Get_Switch_Action) forControlEvents:UIControlEventValueChanged];
    [self addSubview:_switchs];
}

-(void)Get_Switch_Action{
    
    //通知執行協議方法
    [self.delagate getSwitchIndex:_num AndSwitchIsOpen:_switchs.on];
}

CG_INLINE CGRect
CGMakeRects(CGFloat x,CGFloat y,CGFloat width,CGFloat height){
    
    CGRect rect;
    
    float w = ScreenWidth/320;
    
    rect = CGRectMake(x * w, y * w, width * w, height * w);
    
    return rect;
}


- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

ViewController.m:spa

#define TABLEVIEW_LENGTH 3
#define TABLEVIEW_NUM 1
#define TABLEVIEW_CELL_HEIGHT 60

#import "ViewControllerC.h"
#import "TableViewCell.h"

@interface ViewControllerC ()<UITableViewDelegate,UITableViewDataSource,ViewControllerDelegate>

@property (strong,nonatomic) UITableView *tableView;

@end

@implementation ViewControllerC

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.view.backgroundColor = [UIColor colorWithRed:232/255.0 green:232/255.0 blue:232/255.0 alpha:1.0];
    _tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, [[UIScreen mainScreen] bounds].size.width, [[UIScreen mainScreen] bounds].size.height)];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [self.view addSubview:_tableView];
    
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return TABLEVIEW_LENGTH;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
    return TABLEVIEW_NUM;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return TABLEVIEW_CELL_HEIGHT;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    static NSString *resusedefier = @"CELL";
    UINib *nib = [UINib nibWithNibName:@"TableViewCell" bundle:nil];
    [tableView registerNib:nib forCellReuseIdentifier:resusedefier];
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:resusedefier];
    if (cell == nil) {
        cell = [[TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:resusedefier];
    }
    cell.delagate = self;
    cell.IconImage.image = [UIImage imageNamed:@"0"];
    if (indexPath.section == 0) {
        cell.nameLab.text = @"協議代理測試1";
        cell.num = 1;
    }else if (indexPath.section == 1) {
        cell.nameLab.text = @"協議代理測試2";
        cell.num = 2;
    }else if (indexPath.section == 2) {
        cell.nameLab.text = @"協議代理測試3";
        cell.num = 3;
    }
    cell.newsInfoLab.text = @"獲取cell上Switch的值";
    return cell;    
}

- (void)getSwitchIndex:(int)index AndSwitchIsOpen:(BOOL)isOpen{
    
    if (index == 1) {
        NSLog(@"Switch1--%@",isOpen?@"YES":@"NO");
    }else if (index == 2){
        NSLog(@"Switch2--%@",isOpen?@"YES":@"NO");
    }else{
        NSLog(@"Switch3--%@",isOpen?@"YES":@"NO");
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

看看效果圖吧:設計

打印結果:代理

以上就是簡單自定義協議代理的例子。指針

                                                        -----輝小魚code

相關文章
相關標籤/搜索