亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

iOS多級列表實現(xiàn)代碼

 更新時間:2016年09月19日 16:26:21   作者:好個秋先生  
這篇文章主要為大家詳細(xì)介紹了iOS多級列表實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在項目開發(fā)中,層級列表經(jīng)常遇到,簡單點的二級列表利用UITableView的Header就可以實現(xiàn),再簡單點的三級列表通過對Cell高度進行調(diào)整也可以實現(xiàn)三級列表的效果。但遇到多級列表,尤其是層次不明的動態(tài)列表就比較麻煩了。

原理

層級列表和樹形結(jié)構(gòu)比較類似,不過不是二叉樹,而是多叉樹。每個節(jié)點只需要擁有指向父節(jié)點和子節(jié)點的兩個指針,就能形成一顆樹。我們將多級列表中每一級對象看作一個node,node擁有兩個屬性,分別為父節(jié)點和子節(jié)點的ID。

每棵樹有個一個虛擬的root節(jié)點,它的ID為rootID,所有節(jié)點中凡是父節(jié)點ID為rootID的便是第一級,對應(yīng)樹結(jié)構(gòu)中的depth(深度)。這樣每一個node對象就都擁有了parentID和childrenID, childrenID為node對象的ID。

我們可以通過rootID查出第一級node,再根據(jù)第一級node的childrenID查出下一級,依次類推,確定所有節(jié)點的父子關(guān)系。同時也可以確定葉子節(jié)點和第一級節(jié)點,也可稱

為根節(jié)點。

效果圖

1.一般多級列表

2.記錄節(jié)點歷史狀態(tài)的列表

思路

1.首先根據(jù) rootID 獲取所有第一級節(jié)點,并放入UITableView的數(shù)據(jù)源 dataSourceArr 中,展示初始化列表

2. 展開: 點擊節(jié)點cell,根據(jù) childrenID 查找下一級nodes,并插入到 dataSourceArr 中currentNode的后面,刷新展示

3. 收攏: 點擊以打開節(jié)點cell,從 dataSourceArr 的CurrentIndex+1開始,如果該節(jié)點的level小于currentNode的level,則移除node,否則停止刷新列表。

4.點擊cell為葉子節(jié)點則不響應(yīng)展開或收攏操作,并把節(jié)點信息通過返回。

dataSourceArr中是這樣的一種符合樹層級結(jié)構(gòu)的順序:

定義節(jié)點對象

遇到問題

1.局部刷新的問題

每次展開或收攏以后刷新列表,一開始采用

復(fù)制代碼 代碼如下:
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

但會導(dǎo)致節(jié)目有整體閃爍的效果,體驗不好。最后考慮采用局部刷新 insertRowsAtIndexPaths 和 deleteRowsAtIndexPaths 。

但在刷新中會報錯

* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 2 from section 0 which only contains 2 rows before the update'

推測原因是 current Cell在刷新時的numberOfRowsInSection和刷新insert or del的cell時numberOfRowsInSection不一致導(dǎo)致 。然后嘗試current cell和其他cell分別刷新,完美刷新。

[_reloadArray removeAllObjects];
 [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

 if (currentNode.isExpand) {
  //expand
  [self expandNodesForParentID:currentNode.childrenID insertIndex:indexPath.row];
  [tableView insertRowsAtIndexPaths:_reloadArray withRowAnimation:UITableViewRowAnimationNone];
 }else{
  //fold
  [self foldNodesForLevel:currentNode.level currentIndex:indexPath.row];
   [tableView deleteRowsAtIndexPaths:_reloadArray withRowAnimation:UITableViewRowAnimationNone];
 }

2.怎么保存節(jié)點歷史狀態(tài)

當(dāng)文件級層比較多時,有時希望能關(guān)掉層級后再打開時還能保留子層級的打開狀態(tài)。我們可以會給每一個node一個是否展開的屬性,當(dāng)fold時只修改currentNode的expand屬性,expand時對子節(jié)點序isexpand=Y(jié)ES的進行遍歷插入。

//expand
- (NSUInteger)expandNodesForParentID:(NSString*)parentID insertIndex:(NSUInteger)insertIndex{

 for (int i = 0 ; i<_nodes.count;i++) {
  YKNodeModel *node = _nodes[i];
  if ([node.parentID isEqualToString:parentID]) {
   if (!self.isPreservation) {
    node.expand = NO;
   }
   insertIndex++;
   [_tempNodes insertObject:node atIndex:insertIndex];
   [_reloadArray addObject:[NSIndexPath indexPathForRow:insertIndex inSection:0]];//need reload nodes

   if (node.isExpand) {
    insertIndex = [self expandNodesForParentID:node.childrenID insertIndex:insertIndex];
   }
  }
 }

 return insertIndex;
}

demo地址:
https://github.com/YangKa/YKMutableLevelTableView.git

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS開發(fā)中不合法的網(wǎng)絡(luò)請求地址如何解決

    iOS開發(fā)中不合法的網(wǎng)絡(luò)請求地址如何解決

    這篇文章主要介紹了iOS開發(fā)中不合法的網(wǎng)絡(luò)請求地址的解決方案,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • iOS 本地視頻和網(wǎng)絡(luò)視頻流播放實例代碼

    iOS 本地視頻和網(wǎng)絡(luò)視頻流播放實例代碼

    本篇文章主要介紹了iOS 本地視頻和網(wǎng)絡(luò)視頻流播放實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • iOS開發(fā)中使用UIScrollView實現(xiàn)圖片輪播和點擊加載

    iOS開發(fā)中使用UIScrollView實現(xiàn)圖片輪播和點擊加載

    這篇文章主要介紹了iOS開發(fā)中使用UIScrollView實現(xiàn)圖片輪播和點擊加載的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-12-12
  • iOS App開發(fā)中修改UILabel默認(rèn)字體的方法

    iOS App開發(fā)中修改UILabel默認(rèn)字體的方法

    UILabel是控制字體顯示的主要方式,這里我們就來看看通過NSAttributedText和NSMutableAttributedText這兩個類或者用runtime的方式來在iOS App開發(fā)中修改UILabel默認(rèn)字體的方法
    2016-07-07
  • iOS開發(fā)UI之弧形文字

    iOS開發(fā)UI之弧形文字

    這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)UI之弧形文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • iOS優(yōu)化UITableViewCell高度計算的一些事兒

    iOS優(yōu)化UITableViewCell高度計算的一些事兒

    這iOS開發(fā)中對于UITableViewCell高度自適應(yīng)的文章已經(jīng)很多很多,但都不是自己所需要的,下面篇文章主要給大家介紹了關(guān)于iOS優(yōu)化UITableViewCell高度計算的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • IOS Swift 開發(fā)QRCore(二維碼)實例詳解

    IOS Swift 開發(fā)QRCore(二維碼)實例詳解

    這篇文章主要介紹了IOS Swift 開發(fā)QRCore(二維碼)實例詳解的相關(guān)資料,這里對開發(fā)二維碼進行了詳細(xì)介紹,需要的朋友可以參考下
    2016-12-12
  • iOS實現(xiàn)獲取系統(tǒng)iTunes音樂的方法示例

    iOS實現(xiàn)獲取系統(tǒng)iTunes音樂的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS如何實現(xiàn)獲取系統(tǒng)iTunes音樂的相關(guān)資料,文中通過示例代碼給大家詳細(xì)介紹了實現(xiàn)的方法,并給大家介紹了MPMediaPickerController的相關(guān)知識,對大家的學(xué)習(xí)或者工作具有一定的幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • IOS開發(fā)第三方語音-微信語音

    IOS開發(fā)第三方語音-微信語音

    微信語音開放平臺致力于為開發(fā)者提供免費的語音技術(shù),目前已經(jīng)開放的語音技術(shù)包括在線語音識別、在線語音合成等,下面通過本篇文章給大家介紹IOS開發(fā)第三方語言-微信語言,需要的朋友可以一起來學(xué)習(xí)下
    2015-08-08
  • iOS中使用UISearchBar控件限制輸入字?jǐn)?shù)的實現(xiàn)方法

    iOS中使用UISearchBar控件限制輸入字?jǐn)?shù)的實現(xiàn)方法

    這篇文章主要介紹了iOS中使用UISearchBar控件限制輸入字?jǐn)?shù)的實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2016-08-08

最新評論