1. 程式人生 > >一種可展開伸縮的tableView實現

一種可展開伸縮的tableView實現

:##簡單實現了一個可展開收縮的tableview,可多級展開,一次收縮,類似於樹形結構,可擴充套件性強。

效果:

table

實現原理:

  • 1、定義一個結構體作為Model,包含tableview將要展示的資料,還必須包含兩個欄位,一個是能標示其父結點的欄位(名字,ID等),一個是結點深度欄位
  • 2、點選cell的時候先判斷當前cell是展開還是未展開的
    • a、當前cell是未展開的,則以當前cell為父結點,查詢其子結點,插入表中
    • b、當前cell已經展開,則從當前cell的下一行開始,到第一個深度不小於當前cell的位置為止,將此範圍內的cell其資料刪除。

下面是具體實現,可根據需求自行擴充套件

1、結點型別

@interface YMTreeNode : NSObject
@property (nonatomic,copy) NSString *nodeName;//結點名字
@property (nonatomic,copy) NSString *parentNode;//父結點名字
@property (nonatomic,assign) NSInteger nodeDepth;//結點深度
@property (nonatomic,assign) BOOL expanded;//是否展開標誌

- (instancetype)initWithName:(NSString*)name parent:(NSString
*)parent depth:(NSInteger)depth expanded:(BOOL)expanded; @end

2、didSelectRowAtIndexPath方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    YMTreeNode *node = _data[indexPath.row];
    if (node.expanded) {//已展開,則收回
        NSInteger startPosition = indexPath.row
+1; NSInteger endPosition = startPosition; for (NSInteger i=startPosition; i<_data.count; i++) { YMTreeNode *subNode = _data[i]; if (subNode.nodeDepth<=node.nodeDepth) { endPosition = i; break; } endPosition++; } if (endPosition == startPosition) { [self alert]; } else { [_data removeObjectsInRange:NSMakeRange(startPosition, endPosition - startPosition)]; NSMutableArray *indexPaths = [NSMutableArray array]; for (NSUInteger i=startPosition; i<endPosition; i++) { NSIndexPath *tempIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; [indexPaths addObject:tempIndexPath]; } [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; } } else {//未展開,則展開 NSArray *dataInsert = [self queryDataWithParent:node.nodeName andDepth:node.nodeDepth + 1]; if (dataInsert.count == 0) { [self alert]; } else { NSMutableArray *indexPaths = [NSMutableArray array]; for (NSInteger i = 0; i<dataInsert.count; i++) { YMTreeNode *node = dataInsert[i]; [self.data insertObject:node atIndex:indexPath.row + i + 1]; [indexPaths addObject:[NSIndexPath indexPathForRow:indexPath.row + i + 1 inSection:0]]; } [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; // [self.tableView reloadData]; } } node.expanded = !node.expanded; }

相關推薦

展開伸縮tableView實現

:##簡單實現了一個可展開收縮的tableview,可多級展開,一次收縮,類似於樹形結構,可擴充套件性強。 效果: 實現原理: 1、定義一個結構體作為Model,包含tableview將要展示的資料,還必須包含兩個欄位,一個是能標示其父結

Disruptor——替代有界隊列完成並發線程間數據交換的高性能解決方案

top ogl align 來講 好處 文件 最優化 什麽 內存碎片   本文翻譯自LMAX關於Disruptor的論文,同時加上一些自己的理解和標註。Disruptor是一個高效的線程間交換數據的基礎組件,它使用柵欄(barrier)+序號(Sequencing)機制協

內存池的實現方法

返回 memory 內存 cast oca ID incr count delet 基本的數據結構 大圖:https://drive.google.com/file/d/1s5Y_xPB_k-gOXxC1iwG60Jx0kb8yyQ1b/view?usp=sharing

主席樹(持久化線段樹)

map def ini tps set article .org res iostream study from: 靜態主席樹:https://blog.csdn.net/a1351937368/article/details/78884526 動態主席樹:https:

antd展開單元格實現按需展開

每次起一個文章名字的時候都很頭疼,不知道怎麼描述才算得上直截了當,直奔主題。 功能的使用場景 具體使用場景可以參考下圖,當時失敗原因下菜品多餘一個時,當前行可展開;當僅有一個菜品時,當前行不可展開。 解決思路 antd table要用到的屬性 expande

表格多行合併實現程式碼

<!DOCcargoName html /> <html> <head> <title>test table</title> </head> <body> <table id="testTabl

思考(四十四):全服郵件的實現方法

背景假設 考慮到大量玩家線上、以及更多未線上玩家 並假設邏輯服是可以多開的 本文術語 GMTool 能夠傳送 全服郵件 的客戶端 GMServer 給 GMTool 提供服務的伺服器程式

擴充套件的同時進化例項和特徵選擇方法

#引用 ##Latex @article{GARCIAPEDRAJAS2013150, title = “A scalable approach to simultaneous evolutionary instance and feature selectio

最簡單的棧 固定大小 [陣列實現]

/** * Created by yywang on 2017/1/14. */ class stack{ private String [] a; private int N; stack(int cap){ a =

簡單的用java實現快速排序(Quicksort)

1,快速排序(Quicksort)是對氣泡排序的一種改進。對資料量越大,資料分佈越混亂的,一般認為是效能最好的。快排是分治思想的一種體現,把大的問題細化成小問題,把小問題細化成更小的問題,最終把問題縮小到一定規模內,可解決。 2,快排演算法思路就是,先取一個數作為關鍵資料(key一般

Java與groovy混編 —— 兼顧介面清晰和實現敏捷的開發方式

有大量平均水平左右的“工人”可被選擇、參與進來 —— 這意味著好招人 有成熟的、大量的程式庫可供選擇 —— 這意味著大多數專案都是既有程式庫的拼裝,標準化程度高而定製化場景少 開發工具、測試工具、問題排查工具完善,成熟 —— 基本上沒有團隊願意在時間緊、任務重的專案

Java通過jacob生成動態word,還有方法通過word書籤實現

多個word合併 先下載jacob.jar包。 如果是32位系統 將jacob-1.18-x86.dll 檔案複製到下面目錄下,如果是64位作業系統 將jacob-1.18-x64.dll C:\Program Files\Java\jdk1.8.0_45\jre\bi

【Cocos2d-x】圖片描邊的比較好的shader實現方法

轉載: http://blog.csdn.net/u011281572/article/details/44999609 圖片描邊需求如下: 1. 可指定描邊寬度2. 可指定描邊顏色3. 可用於字型 圖片描邊我所知道的方式有以下幾種: 1. Cocos2d-x 3.x中,

防止頁面後退的實現方法(jsp)

當用戶退出系統後,如果再重新開啟登入後的頁面,應該跳轉到一個提示使用者未登入的頁面,這很容易做到,只要在jsp頁面的頭部加上驗證session的程式碼既可以。但是由於瀏覽器有快取,可以後退,如果退出系統後後退,則還是可以開啟退出前的使用者頁面。如何禁止後退以後載入快取的頁

配置web網站開發架構(提綱)

一種可配置web網站開發架構 balabala 全棧角度的網站開發處理要兼顧前後臺、還需要兼顧運維、使用者體驗的功能。但是總的來說是能夠將一個功能給做的完善和好用。全棧意味著全面,全面的體現是功能

衡量的確定MySQL字首索引長度方法

字首索引,是指對於varchar/text/blob型別的欄位建立索引時一般都會選擇前N個字元作為索引。索引很長的字元列,會讓索引變得大且慢。索引開始的部分字元,這樣可以大大節約索引空間,從而提高索引效

malloc函式的簡單的原理性實現

malloc()是C語言中動態儲存管理的一組標準庫函式之一。其作用是在記憶體的動態儲存區中分配一個長度為size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標 malloc()工作機制 malloc函式的實質體現在,它有一個將

chrome 中在棧上建立指定位元組對齊的POD型別的static資料的移植的方法

// AlignedMemory is a POD type that gives you a portable way to specify static // or local stack data of a given alignment and size. For example, if you ne

用JAVA實現排序,JAVA類實現序列化的方法(二)? 如在COLLECTION框架中,實現比較要實現什麼樣的接

} 輸出結果: The ArrayList Sort Before: al[0]=79 al[1]=81 al[2]=14 al[3]=100 al[4]=92 al[5]=76 al[6]=5 al[7]=55 al[8]=39 al[9]=36 [79, 81, 14, 100, 92, 76, 5, 5

Ceph:擴充套件,高效能的分散式檔案系統

摘要 我們開發了 Ceph,一種分散式檔案系統。該檔案系統提供極佳的效能,可靠性以及擴充套件性。通過專為不可靠的物件儲存裝置(Object Storage Device,OSDs)所組成的異構、動態叢集而設計的準隨機資料分配演算法(CRUSH),利用其替代檔案分配表,Cep