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

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

教你寫能被舒服舒服又舒服地調用的iOS庫

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

目錄

前言

腦洞開一開

分析

整容

結語

 

前言

 

2014年過的那么快,過年又那么塊,2015年又是飛快地節奏,真尼瑪感覺上帝是不是無聊使用了變速外掛開啟了加速模式~到現在博主都無法接受已經上班的事實……在地鐵臉被擠在玻璃上的時候只能用眼神寫滿傻X射這個世界一臉??!原諒博主那么雞糞~因為哥最近生病了,不嗨心~~,我想來去想不明白,博主每周健身4天,胸肌壓女友、拳頭比沙煲、吃喝健又康、體硬似野馬,怎么會生病呢?我苦思多日,終于有一天早上起床看了鏡子半個小時后我才頓悟,我靠~原來長得帥真的是錯!上帝在嫉妒我才讓我生病的~哈哈哈 咳咳~這是一個嚴肅的技術博客~是絕對拒絕惡俗低下的內容的,大丈夫應該心系天下才對,最近柴靜和霧霾真的觸動了我們每個人的心;某極端組織像嗨大了一樣,真的是屠龍寶刀在手,裝備任爆的節奏;近下的港島撐完雨傘又要趕人了……我真的是非常痛心疾首,維護世界和平一直是鄙人的愿望,現在的世界這么混亂,本人真的很慚愧,都怪我咯~~沒有因為什么,所以今天博主要教大家怎么寫一個自己用著安逸,修改巴適,他人用起來又無比舒服的iOS庫??!

 

腦洞開一開


本人不才,接觸代碼的世界時間真心不是很久,對于系統底層優化、框架級別設計、設計模式的效率優劣等方面的學習和研究比不深刻,所以如果你是大神,你狠溜的話,我還是建議您路過呵呵一下然后就關了這個網頁吧,雕蟲小技無法入爾法眼啊~我不是怕被噴很菜(反正都被老師噴了二十年了……^_^)而是我對大神都是有敬畏之心的,不能說讓你看你就看,你可以試一下是吧,你也不喜歡看完后是Duang 那么多特效 特技……咳咳 反正這篇文章真的很菜~~~適合比我菜的菜鳥,慎讀。

不過嘛我們要寫一個庫,能夠讓別人用,用起來要很舒服的,那肯定得要設計得當,肯定要熟悉平臺,設計模式非常溜才行,這個沒錯~但是平臺、架構、設計這個東西這么復雜,我解釋大家也不懂,那我就不解釋了(你強迫癥發作死都要懂可自行找一個大學,里面有老師~)

我發誓不扯BB了 我們一起來寫一個能被舒服舒服又舒服地調用的iOS庫,最近衛生紙漲價了,好煩,其實也是有原因的,因為畢竟生產費用什么的也都…我頭上的磚頭誰扔的?。???信不信我不打死你丫的……

假設我們要開發一個像微信朋友圈或者微博這玩意兒的東西,并且要有能隱藏和展開正文、正文中能夠識別富文本(網址、電話、@姓名……)、還要有圖片縮略圖而且點擊查看、能夠有回復、回復文中也要支持富文本……這些功能。像這樣
圖1


所謂君子生非異也 善假于物也。上面的功能這么多這么復雜自己寫,你確定你不是吃飽了撐著?經理也說要敏捷開發,所以二話不說閃現到code4app,code.cocoachina祭出最強殺器——搜索引擎,找到了這個庫WFCoretext https://github.com/TigerWf/WFCoretext 發現它完美符合我們的需求呀,棒棒噠

 

分析


首先我們感謝WFCoretext 的作者的開源貢獻,請收下我的膝蓋,我們馬上來用一用~
圖2


槽點不多
我們來分析分析它怎么搞得把
工程結構 圖3


嗯額 還是比較簡單的 View文件夾里面的是控件啦
圖4


具體實現 大家可以自己看啦,這位哥哥代碼風格還是比較規范的,看起來不費勁
Manager文件夾中是一些富文本匹配規則,其中YMTextData很重要 下面說
我們直接來看看怎么使用的把
點開WXViewController

導包并且聲明變量,變量在實現接下來的實現中會進行初始化

#import "WXViewController.h"#import "YMTableViewCell.h"#import "ContantHead.h"#import "YMShowImageView.h"#import "YMTextData.h"#import "YMReplyInputView.h"#define dataCount 10#define kLocationToBottom 20#define kAdmin @"小虎-tiger"@interface WXViewController ()<UITableViewDataSource,UITableViewDelegate,cellDelegate,InputDelegate>{NSMutableArray *_imageDataSource;NSMutableArray *_contentDataSource;//模擬接口給的數據NSMutableArray *_tableDataSource;//tableview數據源NSMutableArray *_shuoshuoDatasSource;//說說數據源UITableView *mainTable;UIButton *replyBtn;YMReplyInputView *replyView ;}@end  

這三個方法分別構建初始化了一個tableview,初始化并賦值圖片數據,初始化并賦值其他數據

- (void) initTableview;- (void)configImageData;- (void)loadTextData;

 

在loadTextData中會將數據包裝成YMTextData的數組,這樣一個tableCell里面的數據就使用一個YMTextData的數據
然后在

- (void)calculateHeight:(NSMutableArray *)dataArray

中會計算出數據所占用view的高度 這里面也就實現了 我們需求里面可以擴展可以收縮的功能

計算完高度然后就重新加載tableview了 然后tableview的各種delegate方法 各種datasource方法就呼呼的運行了

其中 以下方法中又再次使用了我們在

 

- (void)calculateHeight:(NSMutableArray *)dataArray

方法中計算出來的高度來設置tablecell的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {YMTextData *ym = [_tableDataSource objectAtIndex:indexPath.row];BOOL unfold = ym.foldOrNot;return TableHeader + kLocationToBottom + ym.replyHeight + ym.showImageHeight + kDistance + (ym.islessLimit?0:30) + (unfold?ym.shuoshuoHeight:ym.unFoldShuoHeight) + kReplyBtnDistance;}

以下這個方法又把YMTextData 賦值給了YMTableViewCell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{static NSString *CellIdentifier = @"ILTableViewCell";YMTableViewCell *cell = (YMTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[YMTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];}cell.stamp = indexPath.row;cell.replyBtn.tag = indexPath.row;cell.replyBtn.appendIndexPath = indexPath;[cell.replyBtn addTarget:self action:@selector(replyAction:) forControlEvents:UIControlEventTouchUpInside];cell.delegate = self;[cell setYMViewWith:[_tableDataSource objectAtIndex:indexPath.row]];return cell;}

阿拉巴拉…… 呼呼
我就想問你一句 累不累?
現在我分析了一遍這個庫,你知道該怎么用了么,不要懷疑自己的智商,我也要再看一遍才知道怎么用。
當然我們不能懷疑作者對于開源技術做出的貢獻!我們也不能懷疑作者的開發技術,畢竟這個庫的bug還是比較少的,作者是偉大崇高的!減少了世界的碳排量方便了你我他,為很多代碼工作者提供了方便,讓他們可以不加班,早早的回家陪老婆陪基友陪孩子陪寵物……所以我要再次感謝作者

但是作為一個有完美強迫癥的博主,問自己一句 為什么這個庫那么難用?因為它難用
怎么才算是好用?系統自帶的組件,使用和學習起來那么容易?這應該算是好用吧。

所以接下來,我們要開刀WXViewController 讓他DUANG的一下,變得使用起來 舒服舒服又舒服?。?/span>

整容


我們不妨WXViewController的實現細節都封裝起來!它是一個tableview、它怎么計算高度,它的回復按鈕怎么生成……巴拉巴拉我都不想管??!我的愿望是,我只要扔進去數據,就自動生成一個朋友圈出來?。。?!

有了愿望,急著召喚神龍也沒用!規則是要集齊龍珠呀?。?!好我們先干起來!整容WXViewController?。?!

我們要開發一個東西就叫做 “朋友圈模板”吧 在“朋友圈模板.h”中要有一個“朋友圈模板Delegate” 然后里面要有一個方法

-(返回的數據*)每行朋友圈的數據:index;

我們使用的時候就這樣:

真朋友圈.h

@interface 真朋友圈 : 朋友圈模板<朋友圈模板Delegate> @end

真朋友圈.m

@implementation 真朋友圈- (void)viewDidLoad {self.delegate = self;}-(返回的數據*)每行朋友圈的數據:index{return [朋友圈數據數組 objectAtIndex:index];}@end

這樣就好了!你就再也不用關心朋友圈怎么實現了 你只要關系你的數據部分??!就問你Nice不Nice???
所以這里只要你開發好了“朋友圈模板.m”那么以后“朋友圈模板.h”和“朋友圈模板.m”就是你寫好的能被人舒服舒服又舒服調用的庫了!酷不酷??

博主就手把手教你怎么寫這個“朋友圈模板.m”吧 嘻嘻嘻 手把手哦 呵呵呵 手 把 手喲 博主是很有愛的哦~~~~

我們要開發一個DDRichTextViewController來代替WXViewController <——這個太難用了

我們先來寫寫DDRichTextViewController.h嘛

 

//學學系統組件 我們也來弄一個delegate和datasource~ 其實都是delegate為了更好地區分功能,datasource主要用來設置數據有關@PRotocol DDRichTextViewDelegate @required-(NSString*)senderName;//必須要實現!不然評論別人的時候沒名字 最恨匿名渣渣,自己叫的名字都不敢直接說?。?ldquo;有誰知道我買充氣娃娃都匿名呢 呵呵,???為什么我心里想的會變成文字顯示出來?。?!納尼!!”@optional-(BOOL)hideReplyButtonForIndex:(NSInteger)index;//是否隱藏回復按鈕,有時候我們不讓人回復 就把回復按鈕隱藏起來了-(void)didPromulgatorPressForIndex:(NSInteger)index name:(NSString*)name;//發布者的頭像或者名字被點擊-(void)didRichTextPressedFromText:(NSString*)text index:(NSInteger)index;//正文的富文本被點擊的回調-(void)didRichTextPressedFromText:(NSString*)text index:(NSInteger)index replyIndex:(NSInteger)replyIndex;//評論的富文本被點擊的回調-(void)replyForIndex:(NSInteger)index replyText:(NSString*)text;//回復文字的內容的回調@end@protocol DDRichTextViewDataSource @required-(YMTextData*)dataForRowAtIndex:(NSInteger)index;//這個就是每行需要的數據了!-(NSInteger)numberOfRowsInDDRichText;//需要返回多少行@end@interface DDRichTextViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,cellDelegate,InputDelegate>@property (weak, nonatomic) id delegate;@property (weak, nonatomic) id dataSource;@end

然后就是DDRichTextViewController.m了
基本上就是對WXViewController.m的封裝了! 讓其內部實現的細節都對使用者透明化
比如在DDRichTextViewController中實現了uitableView的datasource和delegate
在這個方法中 tableview需要顯示的行數就由繼承DDRichTextViewController的子類的datasource中的

-(NSInteger)numberOfRowsInDDRichText;


這個方法返回的數據作為參數!

比如這樣:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return [[self dataSource] numberOfRowsInDDRichText];}

所以當我們使用我們自己寫的庫的時候根本不在乎這個方法

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;  

因為我們封裝到了

  -(NSInteger)numberOfRowsInDDRichText;

類似其他實現以及方法都進行了封裝

這當中處理@required很簡單,用戶必須已經實現了 所以直接調用就好 。 但是 @optional的方法用戶不一定會去實現,所以當中最重要的就是要去判斷這個方法存不存在:方法如下

respondsToSelector:NSSelectorFromString(@“方法名:”) //這個凡是繼承NSObject的類都擁有這個方法 這個是基礎了,是運行時判斷方法存不存在的

詳細如下

if ([self.delegate respondsToSelector:NSSelectorFromString(@"hideReplyButtonForIndex:")]) { //判斷hideReplyButtonForIndex方法存不存在 存在才會執行如下的代碼if ([[self delegate] hideReplyButtonForIndex:indexPath.section]) {cell.hideReply = YES;}}

下面是詳細的代碼
(本來想貼詳細代碼的,博主一思忖!最好下載我的Demo進行研究 這樣可以在方法之間跳轉 更能看得懂??!地址在文后!而且你們在博主的Demo項目中star一下 我就愛死你Y的了)

最后我們來看看怎么使用寫好的DDRichTextViewController

我們新建一個TestViewController

TestViewController.h#import "DDRichTextViewController.h"@interface TestViewController : DDRichTextViewController<DDRichTextViewDataSource,DDRichTextViewDelegate>@end 

TestViewController.m

//// TestViewController.m// WFCoretext//// Created by David on 15/2/7.// Copyright (c) 2015年 tigerwf. All rights reserved.//#import "TestViewController.h"@interface TestViewController ()@end@implementation TestViewControllerNSMutableArray * ymDataArray;- (void)viewDidLoad {[super viewDidLoad];NSMutableArray MyDataArr = [[NSMutableArray alloc]init];//!!!!這里應該自己初始化數據self.delegate = self;self.dataSource = self;}//下面兩個是datasource方法-(NSInteger)numberOfRowsInDDRichText{return 5;}-(YMTextData *)dataForRowAtIndex:(NSInteger)index{return [MyDataArr objectAtIndex:0];//!!!!!!!! MyDataArr 是一個YMTextData的數組!!所以你的朋友圈數據的每一項都必須是YMTextData或者繼承YMTextData的子類?。//下面所有都是delegate的方法 朋友圈所有的特性都使用以下的delegate方法進行控制 方法有可選和必選的 可自行實現 接口調用簡單-(NSString *)senderName{return @"David";}-(BOOL)hideReplyButtonForIndex:(NSInteger)index{return NO;}-(void)didPromulgatorNameOrHeadPicPressedForIndex:(NSInteger)index name:(NSString *)name{UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"發布者回調" message:[NSString stringWithFormat:@"姓名:%@/n index:%d",name,index] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];[alert show];}-(void)didRichTextPressedFromText:(NSString*)text index:(NSInteger)index{UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"正文富文本點擊回調" message:[NSString stringWithFormat:@"點擊的內容:%@/n index:%d",text,index] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];[alert show];}-(void)didRichTextPressedFromText:(NSString *)text index:(NSInteger)index replyIndex:(NSInteger)replyIndex{UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"評論的富文本點擊回調" message:[NSString stringWithFormat:@"點擊的內容:%@/n index:%d /n replyIndex:%d",text,index,replyIndex] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];[alert show];}-(void)replyForIndex:(NSInteger)index replyText:(NSString*)text{UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"回復的回調" message:[NSString stringWithFormat:@"回復的內容:%@/n index:%d",text,index] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];[alert show];}@end

 

效果如下
圖5

項目及Demo地址:https://github.com/daiweilai/DDRichText

結語


博主對WXViewController的改動還是頗多的,不單單是簡單地封裝,我還做了表情和姓名的正則判斷,還對YMTableViewCell做了大量的邏輯修改,回調的接口做更改和增添也甚多!需要你親自去發現博主隱藏的愛,但無論如何這都是潦草的項目,想要正式的使用在企業開發中這還遠遠不夠的!沒有進行模塊和單元的測試,其中圖片的處理方式也不好,這里我是直接要求用戶添加Image文件的 這個應該改成 添加圖片地址,然后讓這個庫異步去請求顯示的……所以還是需要大家的開源精神和力量去貢獻自己的,燃燒自己的,騷年文章結束了

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品福利在线| 国产精品久久久久久久久久东京| 97久久久免费福利网址| 欧美另类交人妖| 亚洲成人激情视频| 国产脚交av在线一区二区| 日韩精品中文在线观看| 国产精品视频播放| 亚洲偷熟乱区亚洲香蕉av| 日韩电影免费观看在线| 国内精品美女av在线播放| 欧美日韩人人澡狠狠躁视频| 国产日产久久高清欧美一区| 国产成人亚洲精品| 国产精品吹潮在线观看| 一区二区成人av| 欧美亚洲国产日韩2020| 午夜精品一区二区三区在线播放| 国产精品综合不卡av| 亚洲色图35p| 久久免费精品日本久久中文字幕| 成人a视频在线观看| 亚洲iv一区二区三区| 国产精品视频xxx| 国产精品久久久av久久久| 国内自拍欧美激情| 色99之美女主播在线视频| 欧美黑人一级爽快片淫片高清| 在线观看精品国产视频| 国产日韩欧美中文在线播放| 日韩美女视频中文字幕| 另类色图亚洲色图| 中文字幕日韩免费视频| 啪一啪鲁一鲁2019在线视频| 国产自产女人91一区在线观看| 欧美视频专区一二在线观看| 久久久久久久久爱| 国产aaa精品| 精品福利免费观看| 日韩国产高清视频在线| 亚洲欧美制服中文字幕| 亚洲性线免费观看视频成熟| 日韩在线观看免费| 91人人爽人人爽人人精88v| 欧美精品做受xxx性少妇| 欧美影院在线播放| 久久久精品视频成人| 性色av一区二区三区红粉影视| 91精品视频播放| 日韩欧美综合在线视频| 亚洲区bt下载| 国产亚洲一区精品| 久久精品视频播放| 欧美日韩国产一中文字不卡| 亚洲国产天堂久久综合| 欧美精品性视频| 91丝袜美腿美女视频网站| 深夜福利一区二区| 国产成人av在线播放| 欧洲美女7788成人免费视频| 亚洲精品国产精品久久清纯直播| 国产成人亚洲综合91精品| 国产盗摄xxxx视频xxx69| 91精品视频专区| 欧美与欧洲交xxxx免费观看| 亚洲春色另类小说| 97欧美精品一区二区三区| 91色琪琪电影亚洲精品久久| 欧美激情亚洲视频| 性欧美xxxx视频在线观看| 精品国产老师黑色丝袜高跟鞋| 日韩欧美亚洲综合| 狠狠躁18三区二区一区| 日韩黄色在线免费观看| 91亚洲va在线va天堂va国| 一区二区三区美女xx视频| 日本精品一区二区三区在线| 中文国产成人精品久久一| 国产精品嫩草影院久久久| 68精品久久久久久欧美| 精品magnet| 91精品久久久久久久久久久久久| 日韩专区在线播放| 亚洲国产精品免费| 欧美一区亚洲一区| 日韩在线观看免费av| 亚洲人成免费电影| 国精产品一区一区三区有限在线| 欧美成人黑人xx视频免费观看| 永久免费看mv网站入口亚洲| 欧美激情精品久久久久久变态| 亚洲第一视频在线观看| 91精品啪在线观看麻豆免费| 91在线视频免费| 亚洲成人黄色在线观看| 成人有码在线播放| 亚洲精品www久久久| 日韩中文字幕在线精品| 51精品在线观看| 欧美国产日本在线| 日韩精品视频观看| 欧美亚洲一区在线| 91最新在线免费观看| 国产主播在线一区| 久久91超碰青草是什么| 亚洲精品永久免费精品| 操日韩av在线电影| 日韩在线小视频| 久久精品国产成人| 91av成人在线| 疯狂做受xxxx高潮欧美日本| 日韩久久精品电影| 91视频国产高清| zzjj国产精品一区二区| 国产精品444| 日韩欧美一区二区三区| 久久人人爽亚洲精品天堂| 高清日韩电视剧大全免费播放在线观看| 日韩电影免费观看中文字幕| 国产精品欧美一区二区三区奶水| 国产一区二区三区在线播放免费观看| 亚洲天堂av电影| 中文字幕欧美精品日韩中文字幕| 国产午夜精品理论片a级探花| 亚洲a∨日韩av高清在线观看| 国产成人精品午夜| 欧美激情欧美激情| 久久久久久久久久国产| 国产精品99久久久久久久久| 日韩欧美国产视频| 日韩av成人在线| 国产精品视频xxx| 欧美性视频精品| 久久久噜噜噜久久久| 欧美成人精品在线| 国产日韩在线免费| 国产美女高潮久久白浆| 亚洲成人精品久久久| 668精品在线视频| 精品人伦一区二区三区蜜桃免费| 欧美国产亚洲视频| 国产suv精品一区二区三区88区| 精品国内亚洲在观看18黄| 日韩av在线导航| 日本国产一区二区三区| 日韩一级黄色av| 久久精品视频在线| 亚洲国产精品高清久久久| 国产日韩欧美中文| 亚洲国产一区二区三区四区| 韩国v欧美v日本v亚洲| 欧美综合国产精品久久丁香| 欧美日韩国产中文精品字幕自在自线| 亚洲精品国产欧美| 精品国产一区二区三区久久| 97视频免费在线看| 久久精品人人做人人爽| 久久久久北条麻妃免费看| 精品一区电影国产| 精品视频久久久久久久| 久久亚洲电影天堂| 夜夜狂射影院欧美极品| 在线丨暗呦小u女国产精品| 国产精品日韩久久久久|