亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS學習筆記2015-03-27我理解的OC-代理模式

2019-11-14 19:21:54
字體:
來源:轉載
供稿:網友

案例1

KCButton.h////  KCButton.h//  PRotocol&Block&Category////  Created by Kenshin Cui on 14-2-2.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import <Foundation/Foundation.h>@class KCButton;//一個協議可以擴展另一個協議,例如KCButtonDelegate擴展了NSObject協議@protocol KCButtonDelegate <NSObject>@required //@required修飾的方法必須實現-(void)onClick:(KCButton *)button;@optional //@optional修飾的方法是可選實現的-(void)onMouSEOver:(KCButton *)button;-(void)onMouseout:(KCButton *)button;@end@interface KCButton : NSObject#pragma mark - 屬性#pragma mark 代理屬性,同時約定作為代理的對象必須實現KCButtonDelegate協議@property (nonatomic,retain) id<KCButtonDelegate> delegate;#pragma mark - 公共方法#pragma mark 點擊方法-(void)click;@end
KCButton.m////  KCButton.m//  Protocol&Block&Category////  Created by Kenshin Cui on 14-2-2.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import "KCButton.h"@implementation KCButton-(void)click{    NSLog(@"Invoke KCButton's click method.");    //判斷_delegate實例是否實現了onClick:方法(注意方法名是"onClick:",后面有個:)    //避免未實現ButtonDelegate的類也作為KCButton的監聽    if([_delegate respondsToSelector:@selector(onClick:)]){        [_delegate onClick:self];    }}@endMyListener.h////  MyListener.h//  Protocol&Block&Category////  Created by Kenshin Cui on 14-2-2.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import <Foundation/Foundation.h>@class KCButton;@protocol KCButtonDelegate;@interface MyListener : NSObject<KCButtonDelegate>-(void)onClick:(KCButton *)button;@endMyListener.m////  MyListener.m//  Protocol&Block&Category////  Created by Kenshin Cui on 14-2-2.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import "MyListener.h"#import "KCButton.h"@implementation MyListener-(void)onClick:(KCButton *)button{    NSLog(@"Invoke MyListener's onClick method.The button is:%@.",button);}@endmain.m////  main.m//  Protocol&Block&Category////  Created by Kenshin Cui on 14-2-2.//  Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#import <Foundation/Foundation.h>#import "KCButton.h"#import "MyListener.h"int main(int argc, const char * argv[]) {    @autoreleasepool {                KCButton *button=[[KCButton alloc]init];        MyListener *listener=[[MyListener alloc]init];        button.delegate=listener;        [button click];        /* 結果:         Invoke KCButton's click method.         Invoke MyListener's onClick method.The button is:<KCButton: 0x1001034c0>.         */    }    return 0;}
我們通過例子模擬了一個按鈕的點擊過程,有點類似于java中事件的實現機制。通過這個例子我們需要注意以下幾點內容:id可以表示任何一個ObjC對象類型,類型后面的”<協議名>“用于約束作為這個屬性的對象必須實現該協議(注意:使用id定義的對象類型不需要加“*”);MyListener作為事件觸發者,它實現了KCButtonDelegate代理(在ObjC中沒有命名空間和包的概念,通常通過前綴進行類的劃分,“KC”是我們自定義的前綴)在.h文件中如果使用了另一個文件的類或協議我們可以通過@class或者@protocol進行聲明,而不必導入這個文件,這樣可以提高編譯效率(注意有些情況必須使用@class或@protocol,例如上面KCButton.h中上面聲明的KCButtonDelegate協議中用到了KCButton類,而此文件下方的KCButton類聲明中又使用了KCButtonDelegate,從而形成在一個文件中互相引用關系,此時必須使用@class或者@protocol聲明,否則編譯階段會報錯),但是在.m文件中則必須導入對應的類聲明文件或協議文件(如果不導入雖然語法檢查可以通過但是編譯鏈接會報錯);使用respondsToSelector方法可以判斷一個對象是否實現了某個方法(需要注意方法名不是”onClick”而是“onClick:”,冒號也是方法名的一部分);屬性中的(nonatomic,retain)不是這篇文章的重點,在接下來的文章中我們會具體介紹。

 

案例2

////  WPContactsViewController.h//  OC-UI-表單-單元格////  Created by wangtouwang on 15/3/26.//  Copyright (c) 2015年 wangtouwang. All rights reserved.//#import <UIKit/UIKit.h>@interface WPContactsViewController : UIViewController{    UITableView *_tableView;//表單UI控件    NSMutableArray *_mutableArrayContacts;//聯系人集合模型    NSIndexPath *_selectedIndexPath;//當前選中的組和行}@end
////  WPContactsViewController.m//  OC-UI-表單-單元格////  Created by wangtouwang on 15/3/26.//  Copyright (c) 2015年 wangtouwang. All rights reserved.//#import "WPContactsViewController.h"#import "WPContacts.h"#import "WPContactsGroup.h"@interface WPContactsViewController ()<UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>@end@implementation WPContactsViewController- (void)viewDidLoad {    [super viewDidLoad];    //初始化數據    [self initObjectData];        //創建一個分組樣式的UITableView    _tableView=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];        //設置數據源,注意必須實現對應的UITableViewDataSource協議    _tableView.dataSource=self;        //設置代理    _tableView.delegate=self;        [self.view addSubview:_tableView];}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}#pragma mark 加載數據-(void)initObjectData{     _mutableArrayContacts=[[NSMutableArray alloc]init];        WPContacts *contact1=[WPContacts initStaticWithFirstName:@"Cui" andLastName:@"Kenshin" andPhoneNumber:@"18500131234"];    WPContacts *contact2=[WPContacts initStaticWithFirstName:@"Cui" andLastName:@"Tom" andPhoneNumber:@"18500131237"];    WPContactsGroup *group1=[WPContactsGroup initStaticWithName:@"C" andDescript:@"With names beginning with C" andConcats:[NSMutableArray arrayWithObjects:contact1,contact2, nil]];    [_mutableArrayContacts addObject:group1];         WPContacts *contact3=[WPContacts initStaticWithFirstName:@"Dui" andLastName:@"JACK" andPhoneNumber:@"13712133321"];    WPContacts *contact4=[WPContacts initStaticWithFirstName:@"Dui" andLastName:@"LUCY" andPhoneNumber:@"13712133322"];    WPContactsGroup *group2=[WPContactsGroup initStaticWithName:@"D" andDescript:@"With names beginning with D" andConcats:[NSMutableArray arrayWithObjects:contact3,contact4, nil]];    [_mutableArrayContacts addObject:group2];    }#pragma mark 返回分組數-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{    NSLog(@"計算分組數");    return _mutableArrayContacts.count;}#pragma mark 返回每組行數- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    NSLog(@"計算每組(組%lu)行數",(unsigned long)section);//    WPContactsGroup *group1 = _mutableArrayContacts[section];    return  ((WPContactsGroup *)_mutableArrayContacts[section])._concats.count;}#pragma mark返回每行的單元格- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{     NSLog(@"生成單元格(組:%lu,行%lu)",(unsigned long)indexPath.section,(unsigned long)indexPath.row);   WPContactsGroup *group= _mutableArrayContacts[indexPath.section];    WPContacts *contacts = group._concats[indexPath.row];    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil];    cell.textLabel.text=[contacts getName];    cell.detailTextLabel.text = [contacts _phoneNumber];    return cell;}#pragma mark 返回每組頭標題名稱- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{     NSLog(@"生成組(組%lu)名稱",(unsigned long)section);    WPContactsGroup *group =  _mutableArrayContacts[section];    return group._name;}#pragma mark 返回每組尾部說明- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{    NSLog(@"生成尾部(組%lu)詳情",(unsigned long)section);    return ((WPContactsGroup *)_mutableArrayContacts[section])._descript;}#pragma mark 生成索引- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{    NSLog(@"生成組索引");    NSMutableArray *indexs = [[NSMutableArray alloc] init];    for (WPContactsGroup *group in _mutableArrayContacts) {        [indexs addObject:group._name];    }    return indexs;}#pragma mark 設置分組標題高度- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{    NSLog(@"設置分組標題高度");    return 25;}#pragma mark 設置分組尾部內容高度- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{    NSLog(@"設置分組尾部內容高度");    return 20;}#pragma mark 設置每行高度- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{       NSLog(@"設置每行高度");    return 30;}#pragma mark 復寫設置點擊行觸發事件(復寫的方法是在TableViewDelegate協議中已有,回調)-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    NSLog(@"觸發我吧");     _selectedIndexPath=indexPath;    //獲取單元格包裝的對象WPContacts   WPContacts *contacts = ((WPContactsGroup *)_mutableArrayContacts[indexPath.section])._concats[indexPath.row];    //初始化彈出框    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"System Info" message:[contacts getName] delegate:self cancelButtonTitle:@"Cancle" otherButtonTitles:@"OK", nil];    //設置窗口樣式    alertView.alertViewStyle=UIAlertViewStylePlainTextInput;    //獲取文本框    UITextField *textFild =  [alertView textFieldAtIndex:0];    //設置文本框內容    textFild.text = contacts._phoneNumber;    //顯示窗口    [alertView show];}#pragma mark 設置彈出框后續按鈕事件 復寫UIAlerViewDelegate協議 的點擊按鈕 clickedButtonAtIndex方法- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{    NSLog(@"設置彈出框后續按鈕事件 clickedButtonAtIndex");    if (buttonIndex==1) {        //獲取文本框內容        NSString *phoneNumber = [alertView textFieldAtIndex:0].text;            //獲取選中的UITableViewCell 包裝的對象       WPContacts *contacts =  ((WPContactsGroup *)_mutableArrayContacts[_selectedIndexPath.section])._concats[_selectedIndexPath.row];        contacts._phoneNumber = phoneNumber;                 NSArray *indexPaths=@[_selectedIndexPath];//需要局部刷新的單元格的組、行            //此處優化 將全局跟新 該變到 選擇行 局部更新        [_tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft];                //[_tableView reloadData];    }}@end

 

 

 

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区在线| 一本一本久久a久久精品综合小说| 久久久精品国产一区二区| 日本高清不卡在线| 国产精品一区电影| 懂色av影视一区二区三区| 精品成人在线视频| 亚洲丁香婷深爱综合| 久青草国产97香蕉在线视频| 中文字幕亚洲精品| 久久久久亚洲精品成人网小说| 国产精品久久久久久久久借妻| 亚洲国产高潮在线观看| 亚洲3p在线观看| 亚洲人线精品午夜| 欧美国产日本在线| 亚洲国产成人久久综合| 欧美激情精品久久久久久变态| 国产999精品久久久影片官网| 亚洲第一男人av| 午夜精品久久久久久久久久久久| 九九热视频这里只有精品| 成人福利视频在线观看| 78m国产成人精品视频| 色av中文字幕一区| 欧美精品videos另类日本| 亚洲精品一区av在线播放| 91精品中文在线| 欧美日韩国产第一页| 九色91av视频| 国产精品一区二区久久精品| 日韩av综合网| 欧美日韩999| 精品久久久久久久久久久| 成人免费视频xnxx.com| 久久久久久伊人| 日本欧美一二三区| 日韩综合视频在线观看| 国产欧美日韩免费看aⅴ视频| 欧美性猛交xxxx黑人| 欧美中文在线字幕| 国产一区二区黄| 91理论片午午论夜理片久久| 最新国产精品亚洲| 久久久久久com| 久久777国产线看观看精品| 最新69国产成人精品视频免费| 97视频网站入口| 欧美激情18p| 国产成人福利夜色影视| 中文字幕日韩有码| 亚洲国产成人爱av在线播放| 亚洲欧美www| 日韩成人中文字幕| 亚洲欧美国产高清va在线播| 欧美日韩一区二区免费视频| 国产精品福利无圣光在线一区| 国内精品美女av在线播放| 91精品国产高清自在线| 91成人国产在线观看| 中文字幕日韩欧美精品在线观看| 亚洲无亚洲人成网站77777| 亚洲最大在线视频| 国产精品国产三级国产aⅴ9色| 久久视频国产精品免费视频在线| 98视频在线噜噜噜国产| 国模精品一区二区三区色天香| 欧美大片在线影院| 欧美午夜精品久久久久久浪潮| 午夜免费在线观看精品视频| 日本伊人精品一区二区三区介绍| 日韩电影大片中文字幕| 欧美激情区在线播放| 视频直播国产精品| 亚洲人永久免费| 国产日韩换脸av一区在线观看| 在线观看中文字幕亚洲| 另类色图亚洲色图| 美日韩丰满少妇在线观看| 69**夜色精品国产69乱| 亚洲www视频| 一色桃子一区二区| 国产成人自拍视频在线观看| 日产日韩在线亚洲欧美| 在线观看欧美成人| 在线观看免费高清视频97| 日韩成人激情在线| 久久久最新网址| 精品久久久一区| 精品一区精品二区| 国产成人高潮免费观看精品| 8x拔播拔播x8国产精品| 日韩av电影中文字幕| 日韩美女av在线免费观看| 成人有码视频在线播放| 欧美激情精品久久久久久大尺度| 97在线看免费观看视频在线观看| 国产精品电影观看| 国产精品嫩草影院一区二区| 日韩在线视频免费观看高清中文| 日韩少妇与小伙激情| 亚洲国产小视频在线观看| 91久久精品在线| 久久视频这里只有精品| 亚洲一区二区三区四区在线播放| 亚洲图片制服诱惑| 在线观看国产欧美| 久久综合九色九九| 欧美床上激情在线观看| 成人信息集中地欧美| 精品视频中文字幕| 欧美激情精品久久久久久免费印度| 国产精品精品一区二区三区午夜版| 中文字幕日韩欧美精品在线观看| 日韩精品在线观| 亚洲欧美国产一本综合首页| 国内精品久久久久| 日韩高清有码在线| 亚洲国产天堂久久综合| 国产日产亚洲精品| 日韩国产欧美精品在线| 亚洲欧美一区二区精品久久久| 亚洲一区二区福利| 亚洲欧洲在线免费| 久久99精品久久久久久青青91| 欧美日韩亚洲国产一区| 亚洲影院在线看| 欧美乱大交做爰xxxⅹ性3| 都市激情亚洲色图| 久久久久久91| 性欧美xxxx视频在线观看| 国产精品大陆在线观看| 国产精品视频成人| 国产成人在线亚洲欧美| 国产精品a久久久久久| 欧美一区二三区| 一区二区欧美久久| 亚洲美女av在线| 最近2019中文免费高清视频观看www99| 91免费视频网站| 亚洲一区二区三区视频播放| 欧美国产日韩一区| 欧美激情综合色综合啪啪五月| 日韩小视频在线| 亚洲天堂男人天堂女人天堂| 亚洲码在线观看| 欧美黑人巨大精品一区二区| 91在线色戒在线| 91豆花精品一区| 美日韩丰满少妇在线观看| 亚洲人永久免费| 久久影视免费观看| 黑人巨大精品欧美一区二区免费| 欧美性猛交xxxx免费看| 午夜精品理论片| 日韩最新av在线| 国产又爽又黄的激情精品视频| 国产视频亚洲精品| 97久久精品人人澡人人爽缅北| 亚洲白虎美女被爆操| 97超级碰碰人国产在线观看| 久久亚洲国产精品| 日本aⅴ大伊香蕉精品视频| 欧美精品中文字幕一区|