iOS:分組的表格視圖UITableView,能夠摺疊和展開

雖然表格視圖能夠分組,可是若是分組後,每一行的內容太多,日後翻看起來比較的麻煩。爲了解決這個麻煩,能夠將分組的行摺疊和展開。摺疊時,行內容就會隱藏起來;展開時,行內容就會顯示出來。ide

摺疊時:                        展開後:字體

     

  具體的代碼以下:atom

複製代碼
  1 #import "ViewController.h"
  2 
  3 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
  4 @property (weak, nonatomic) IBOutlet UITableView *tableView;
  5 @property (strong,nonatomic)NSArray *provinces;
  6 @property (strong,nonatomic)NSDictionary *cities;
  7 @property (strong,nonatomic)NSMutableArray *Cellstates;
  8 @end
  9 
 10 @implementation ViewController
 11 
 12 - (void)viewDidLoad {
 13     [super viewDidLoad];
 14     //初始化
 15     self.provinces = [NSArray array];
 16     self.cities = [[NSDictionary alloc]init];
 17     self.Cellstates = [NSMutableArray arrayWithCapacity:self.provinces.count];
 18     
 19     //加載數據
 20     NSString *path = [[NSBundle mainBundle]pathForResource:@"cities" ofType:@"plist"];
 21     NSDictionary *dic = [[NSDictionary alloc]initWithContentsOfFile:path];
 22     
 23     if(dic)
 24     {
 25         //全部的省份
 26         self.provinces = [dic objectForKey:@"provinces"];
 27         
 28         //全部的城市
 29         self.cities = [dic objectForKey:@"cities"];
 30     }
 31     
 32     //默認每個section都是摺疊的
 33     for(int i=0; i<self.provinces.count; i++)
 34     {
 35         NSNumber *state = [NSNumber numberWithBool:NO];
 36         [self.Cellstates addObject:state];
 37     }
 38     
 39     //設置數據源和代理
 40     self.tableView.dataSource = self;
 41     self.tableView.delegate = self;
 42     
 43 }
 44 
 45 #pragma mark -tableView的數據源方法
 46 //有多少個分組
 47 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 48 {
 49     return self.provinces.count;
 50 }
 51 //每一個分組有多少行
 52 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 53 {
 54     if([self.Cellstates[section] boolValue]) //展開的
 55     {
 56         //取出全部的城市
 57         NSArray *cities = [self.cities objectForKey:self.provinces[section]];
 58         return cities.count;
 59     }
 60     else //摺疊的
 61     {
 62         return 0;
 63     }
 64 }
 65 //設置每個單元格的內容
 66 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 67 {
 68     //1.根據reuseIdentifier,先到對象池中去找重用的單元格對象
 69     static NSString *reuseIdentifier = @"citiesCell";
 70     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
 71     //2.若是沒有找到,本身建立單元格對象
 72     if(cell == nil)
 73     {
 74         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
 75     }
 76     //3.設置單元格對象的內容
 77     //取出全部的城市
 78     NSArray *cities = [self.cities objectForKey:self.provinces[indexPath.section]];
 79     cell.textLabel.text = cities[indexPath.row];
 80     //設置字體顏色
 81     cell.textLabel.textColor = [UIColor orangeColor];
 82     
 83     return cell;
 84 }
 85 //設置頭部標題
 86 -(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
 87 {
 88     return self.provinces[section];
 89 }
 90 #pragma mark -tableView的代理方法
 91 -(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
 92 {
 93     UIButton *button = [[UIButton alloc]init];
 94     
 95     //設置標題
 96     [button setTitle:self.provinces[section] forState:UIControlStateNormal];
 97     
 98     //設置顏色
 99     [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
100     
101     //設置對齊方式
102     button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
103     
104     //設置字體大小
105     button.titleLabel.font = [UIFont systemFontOfSize:20];
106     
107     //添加事件
108     [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
109     
110     //記住button的tag
111     button.tag = section;
112     
113     return button;
114 }
115 
116 #pragma mark -按鈕的事件響應
117 -(void)buttonClicked:(UIButton*)sender
118 {
119     //1.取出舊狀態
120     NSNumber *oldState = [self.Cellstates objectAtIndex:sender.tag];
121     
122     //2.建立新狀態
123     NSNumber *newState = [NSNumber numberWithDouble:![oldState boolValue]];
124     
125     //3.刪除舊狀態
126     [self.Cellstates removeObjectAtIndex:sender.tag];
127     
128     //4.添加新狀態
129     [self.Cellstates insertObject:newState atIndex:sender.tag];
130     
131     //刷新表格
132     [self.tableView reloadData];
133 }
134 @end