RATree應(yīng)用-無(wú)限級(jí)增刪改節(jié)點(diǎn)

? ? ? ?RATree是一個(gè)樹(shù)形視圖三方庫(kù)洞渤,可以在GitHub上下載,這個(gè)三方庫(kù)是通過(guò)對(duì)UITabelview的封裝來(lái)實(shí)現(xiàn)了一個(gè)多層級(jí)醉蚁、無(wú)限制的自定義視圖拉背。你可以利用它來(lái)實(shí)現(xiàn)多種UI效果住闯,這里我實(shí)現(xiàn)了一個(gè)公司組織結(jié)構(gòu)增断箫、刪拂酣、改的功能。

增刪改效果圖.gif

? ? ? ?關(guān)于RATree的使用仲义,官方有一個(gè)英文的文檔說(shuō)明婶熬,看起來(lái)比較費(fèi)勁剑勾,我的小伙伴寫(xiě)了一篇文章基本上講明白了怎么個(gè)使用,有興趣的童鞋可以參考文章iOS樹(shù)狀視圖(折疊單元格)詳細(xì)使用
赵颅。

Demo思想

數(shù)據(jù)源

? ? ? ?RATree的數(shù)據(jù)源@property (strong,nonatomic) NSMutableArray *dataSource;看起來(lái)可以和UITableView的數(shù)據(jù)源一樣虽另,但是意義不同,數(shù)組中每個(gè)元素在UITableView中一般指代每一行饺谬,而在RATree中指代的是幾個(gè)根節(jié)點(diǎn)捂刺,這個(gè)Demo中相當(dāng)于只有一個(gè)元素(Model),再來(lái)看一下Model的創(chuàng)建募寨。

#import <Foundation/Foundation.h>

@interface CellModel : NSObject

@property (strong, nonatomic) NSString *name;

@property (strong, nonatomic) NSMutableArray *children;

- (id)initWithName:(NSString *)name children:(NSMutableArray *)array;


@end

? ? ? ?解釋一下name就是這一行的標(biāo)題族展,你當(dāng)然也可以設(shè)置的更花哨,完全由你的界面決定拔鹰。但children又是一個(gè)數(shù)組仪缸,就是子節(jié)點(diǎn)們,可以有很多列肢,也可以是空恰画。模型就是這樣創(chuàng)建的,這個(gè)Demo中一開(kāi)始初始化的時(shí)候瓷马,dataSource中就一個(gè)CellModel拴还,children初始化了一下,但是沒(méi)有東西决采。添加子節(jié)點(diǎn)自沧,實(shí)際上就是對(duì)它的Model的children添加元素,元素的類(lèi)型還是CellModel類(lèi)型树瞭。

代理方法

? ? ? ?數(shù)據(jù)源的問(wèn)題解決后拇厢,關(guān)鍵是怎么使用RATreeView的RATreeDelegateRATreeDataSource

#pragma mark- RATree的dataSouce
- (NSInteger)treeView:(RATreeView *)treeView numberOfChildrenOfItem:(nullable id)item
{
        if (item == nil)
        {
            return self.dataSource.count;
        }
        CellModel *model = (CellModel *)item;
    
        return model.children.count;
    
    
}



- (UITableViewCell *)treeView:(RATreeView *)treeView cellForItem:(nullable id)item
{
    TreeTableViewCell *cell = [treeView dequeueReusableCellWithIdentifier:@"TreeTableViewCell"];
    
    cell.delegate = self;
    
    NSUInteger level = [treeView levelForCellForItem:item];
    
    BOOL isExpand = [treeView isCellForItemExpanded:item];
    
    [cell refreshCellWithItem:item andLevel:level andIsExpand:isExpand];
    
    return cell;
}


- (id)treeView:(RATreeView *)treeView child:(NSInteger)index ofItem:(nullable id)item
{
    if (item == nil) {
        
        return self.dataSource[index];
    }
    
    CellModel *model = (CellModel *)item;
    
    return model.children[index];
}


- (CGFloat)treeView:(RATreeView *)treeView heightForRowForItem:(id)item
{

    return 50;
}


//將要展開(kāi)
- (void)treeView:(RATreeView *)treeView willExpandRowForItem:(id)item {
    
    

        TreeTableViewCell *cell = (TreeTableViewCell *)[treeView cellForItem:item];
        
        cell.imgView.image = [UIImage imageNamed:@"header_arrow_down"];
    
}
//將要收縮
- (void)treeView:(RATreeView *)treeView willCollapseRowForItem:(id)item {
    
    
    TreeTableViewCell *cell = (TreeTableViewCell *)[treeView cellForItem:item];
    
    cell.imgView.image = [UIImage imageNamed:@"header_arrow_right"];
}


- (void)treeView:(RATreeView *)treeView didSelectRowForItem:(id)item
{

    [treeView deselectRowForItem:item animated:NO];
}


#pragma mark - TreeTableViewCell的delegate

-(void)clickTheBtn:(UIButton *)btn withTitle:(NSString *)name inTheCell:(TreeTableViewCell *)cell
{
    if ([name isEqualToString:@"增加"]) {
        
        [self addNodeToCell:cell];
        
    }
    else if([name isEqualToString:@"刪除"])
    {
        [self deleteNoteFromCell:cell];
    }
    else
    {
        [self editNoteToCell:cell];
    }

}

? ? ? ?UITableView的代理方法里晒喷,有倆個(gè)必須實(shí)現(xiàn)的方法孝偎,而在RATree里面有是三個(gè)。關(guān)鍵是這三個(gè)都什么意思凉敲,明白了就知道該怎么寫(xiě)了衣盾。按三個(gè)代理方法被調(diào)用的先后順序來(lái)說(shuō)明一下

  1. - (NSInteger)treeView:(RATreeView *)treeView numberOfChildrenOfItem:(nullable id)item
    ? ? ? ?這個(gè)方法實(shí)際上它回調(diào)回來(lái)給你的參數(shù)有treeViewitemtreeView沒(méi)什么好說(shuō)的爷抓,告訴你是哪個(gè)treeView势决,item其實(shí)返回的是你當(dāng)前視圖這一行(不論父節(jié)點(diǎn)還是子節(jié)點(diǎn))的父親節(jié)點(diǎn)對(duì)象。當(dāng)最開(kāi)始的根節(jié)點(diǎn)的時(shí)候蓝撇,item返回的是nil果复,其他情況下就會(huì)返回父節(jié)點(diǎn)對(duì)象。然后代理方法問(wèn)你要這個(gè)item孩子們有幾個(gè)渤昌?你告訴它就是了虽抄,return出去走搁。
  2. - (id)treeView:(RATreeView *)treeView child:(NSInteger)index ofItem:(nullable id)item
    ? ? ? ?這個(gè)方法緊接著被調(diào)用,簡(jiǎn)單的來(lái)說(shuō)他給你的參數(shù)item還是當(dāng)前視圖這一行的父節(jié)點(diǎn)Model迈窟,如果是空私植,就代表當(dāng)前視圖是根節(jié)點(diǎn)。index實(shí)際上是告訴你這一次的回調(diào)是第幾個(gè)孩子的回調(diào)车酣。說(shuō)白了就是它告訴你哪個(gè)treeView下哪個(gè)節(jié)點(diǎn)(item)的第幾個(gè)(index)孩子曲稼,是個(gè)什么對(duì)象(model)?你return這個(gè)對(duì)象(model)就行了骇径。
  3. - (UITableViewCell *)treeView:(RATreeView *)treeView cellForItem:(nullable id)item
    ? ? ? ?這方法一看就是到它是問(wèn)你要Cell呢躯肌,告訴你哪個(gè)treeView,哪個(gè)模型Model(其實(shí)也全靠第2個(gè)代理方法你return的者春,它才知道)破衔,然后問(wèn)你要Cell。這里實(shí)際上和UITableView不同钱烟,更直接的告訴你Model了晰筛,咱們以前都是self.dataSouce[indexPath.row]來(lái)找到模型,這個(gè)封裝的直接告訴你模型了(item)很爽吧拴袭。

總結(jié)

? ? ? ?其他的代理方法和自身的方法不說(shuō)了自己研究吧读第,都可以看名字猜意思。至于增刪改的思路就是拥刻,點(diǎn)擊cell的事件全部回調(diào)到controller去執(zhí)行怜瞒,然后順便把自己(也就是self)當(dāng)參數(shù)回調(diào)出去,然后般哼。然后通過(guò)數(shù)據(jù)源找到對(duì)應(yīng)的模型吴汪,修改就是了,然后刷新蒸眠。思路就是漾橙,視圖永遠(yuǎn)跟著模型走,要改什么不要去改界面楞卡,去改模型霜运,然后刷頁(yè)面,這樣就不會(huì)錯(cuò)了蒋腮,尤其是在這種復(fù)用的機(jī)制下淘捡。我覺(jué)得這個(gè)三方庫(kù)一開(kāi)始看我也很頭疼,和小伙伴研究了一下總算理清楚思路了池摧,只要把數(shù)據(jù)源和三個(gè)代理方法掌握了焦除,就一切OK了。

Demo的下載地址:https://github.com/iOSKesai/RATreeDemo.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末险绘,一起剝皮案震驚了整個(gè)濱河市踢京,隨后出現(xiàn)的幾起案子誉碴,更是在濱河造成了極大的恐慌,老刑警劉巖瓣距,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黔帕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蹈丸,警方通過(guò)查閱死者的電腦和手機(jī)成黄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逻杖,“玉大人奋岁,你說(shuō)我怎么就攤上這事≥┌伲” “怎么了闻伶?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)够话。 經(jīng)常有香客問(wèn)我蓝翰,道長(zhǎng),這世上最難降的妖魔是什么女嘲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任畜份,我火速辦了婚禮,結(jié)果婚禮上欣尼,老公的妹妹穿的比我還像新娘爆雹。我一直安慰自己,他們只是感情好愕鼓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钙态。 她就那樣靜靜地躺著,像睡著了一般拒啰。 火紅的嫁衣襯著肌膚如雪驯绎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天谋旦,我揣著相機(jī)與錄音剩失,去河邊找鬼。 笑死册着,一個(gè)胖子當(dāng)著我的面吹牛拴孤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甲捏,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼演熟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芒粹,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兄纺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后化漆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體估脆,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年座云,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疙赠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朦拖,死狀恐怖圃阳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情璧帝,我是刑警寧澤捍岳,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站裸弦,受9級(jí)特大地震影響祟同,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜理疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泞坦。 院中可真熱鬧窖贤,春花似錦、人聲如沸贰锁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豌熄。三九已至授嘀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锣险,已是汗流浹背蹄皱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芯肤,地道東北人巷折。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像崖咨,于是被迫代替她去往敵國(guó)和親锻拘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容