IOS代理淺析

征途LN發表於2013-12-15

一直想總結一下關於代理的用法,恰好今天有時間。

現在有這樣一個需求:比如A是圖書閱讀介面,介面上有個按鈕是【新增書籤】,這個按鈕有一個響應事件-(void)addBookMarkAtIndexPath,把當前頁作為書籤給存入資料庫;B介面是書籤展示介面,用來顯示這本書中新增的書籤。當在A中點選【新增書籤】後,B中要把當前頁的縮圖給顯示出來。其實這些功能不用代理也能實現,用代理是為了是類之間的聯絡更加的鬆散,以後程式碼的維護比較省心

建立一個協議

@protocol BookMarkDelegate <NSObject>

- (void) addABookMarkThoughIndexPage: (NSInteger)page;

@end;


A類如下

.h

@Class BookMarkDelegate;

@interface A : UIViewController

@protocol (nonatomic,weak)  id<BookMarkDelegate> delegate;

@end;


.m

@implementation A 

UIButton * addMarkButton = [ UIButton buttonWithType: UIButtonTypeCustom];

[addMarkButton addTarget:self action:@select(addBookMarkAtIndexPath) forControlEvents: UIControllerEventsTouchUpInside];

……


-(void)addBookMarkAtIndexPath{

[self.delegate addABookMarkThoughIndexPage:self.currentPage];

}

@end


B類

.h

@interface B :NSObject <BookMarkDelegate>


.m

@interface B ()

- (void) addMarkAtPage: (NSInteger) index;

@end


@implementation B

//在B中要例項化A,將A中的delegate指向自己

A* a = [[A alloc]init];

a.delegate = self;


- (void) addMarkAtPage: (NSInteger) index{

UIView* markView = [self getThumbViewAtIndexPage:index] //取得指定頁的縮圖

markView.frame = CGRectMake(x,y,width,height);

[self.view addSubView: markView];

}


#pragma mark - BookMarkDelegate 

- (void) addABookMarkThoughIndexPage: (NSInteger)page{

[self  addMarkAtPage: page];

}

@end


其實,我對代理的理解也不是很深刻,也就侷限於此類功能的實現,入過你有更深刻的認識,還請留言,共同學習。


相關文章