實作 TableView Section 展開/收合

 from http://blog.yslin.tw/2011/09/tableview-section.html
iPhone中的UITableViewController變化真的很多!
最近剛好需要實作展開/收合的功能,效果如圖所示:

我是參考Expanding/Collapsing TableView Sections的實作,然後在自己簡化。
一個展開/收合的單位為一個Section,Row0表示Parent,Row1~N表示Child,程式碼中都有註解。



  • testTableViewController.h
1
2
3
4
5
6
7
8
#import <uikit uikit.h="">
 
@interface MoodDiaryViewController : UITableViewController {
 /* Store the indexpath which already expanded */
 NSMutableIndexSet *expandedSections;
}
@end
</uikit>


  • testTableViewController.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#import "testTableViewController.h"
 
@implementation MoodDiaryViewController
 
#pragma mark -
#pragma mark View lifecycle
 
- (void)viewDidLoad {
    [super viewDidLoad];
 
 if (!expandedSections)
    {
        expandedSections = [[NSMutableIndexSet alloc] init];
    }
}
 
 
#pragma mark -
#pragma mark Table view data source
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 3;
}
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    /* Return the number of rows in the section. */
 if ([expandedSections containsIndex:section]) {
  /* Return all rows when expanded */
  return 5;
 } else {
  /* Only top row showing */
  return 1;
 }
}
 
 
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d_%d", indexPath.section, indexPath.row];
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  
 if (indexPath.row == 0) {
  /* Parent cell */
  if (cell == nil)
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
   
  /* Change UI status */
  if ([expandedSections containsIndex:indexPath.section]) {
   cell.textLabel.text = [NSString stringWithFormat:@"- Section=%d Row=%d", indexPath.section, indexPath.row];
  } else {
   cell.textLabel.text = [NSString stringWithFormat:@"+ Section=%d Row=%d", indexPath.section, indexPath.row];
  }
   
 } else {
  /* Child cell */
  if (cell == nil)
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
   
  cell.textLabel.text = [NSString stringWithFormat:@"Section=%d Row=%d", indexPath.section, indexPath.row];
 }
 
    return cell;
}
 
 
#pragma mark -
#pragma mark Table view delegate
 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 /* If user choose the parent row */
 if (indexPath.row == 0) {
  NSInteger section = indexPath.section;
  BOOL currentlyExpanded = [expandedSections containsIndex:section];
  NSInteger rows;
  NSMutableArray *arrRows = [NSMutableArray array];
   
  if (currentlyExpanded) {
   /* Child cell for this parent */
   rows = [self tableView:tableView numberOfRowsInSection:section];
   [expandedSections removeIndex:section];
  } else {
   [expandedSections addIndex:section];
   rows = [self tableView:tableView numberOfRowsInSection:section];
  }
 
  /* Create child index path. Child path start frow index one */
  for (int i = 1; i < rows; i++) {
   NSIndexPath *tmpIndexPath = [NSIndexPath indexPathForRow:i inSection:section];
   [arrRows addObject:tmpIndexPath];
  }
 
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
   
  /* Remove of insert above index path into tableview */
  if (currentlyExpanded) {
   [tableView deleteRowsAtIndexPaths:arrRows withRowAnimation:UITableViewRowAnimationTop];
   cell.textLabel.text = [NSString stringWithFormat:@"+ Section=%d Row=%d", indexPath.section, indexPath.row];
  } else {
   [tableView insertRowsAtIndexPaths:arrRows withRowAnimation:UITableViewRowAnimationTop];
   cell.textLabel.text = [NSString stringWithFormat:@"- Section=%d Row=%d", indexPath.section, indexPath.row];
  }
   
 } else { // For choosing child row
  ;
 }
}
 
 
#pragma mark -
#pragma mark Memory management
 
- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
     
    // Relinquish ownership any cached data, images, etc. that aren't in use.
}
 
- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}
 
- (void)dealloc {
    [super dealloc];
}
@end
 
arrow
arrow
    全站熱搜

    zer931 發表在 痞客邦 留言(0) 人氣()