實作 TableView Section 展開/收合
iPhone中的UITableViewController變化真的很多!
最近剛好需要實作展開/收合的功能,效果如圖所示:
我是參考Expanding/Collapsing TableView Sections的實作,然後在自己簡化。
一個展開/收合的單位為一個Section,Row0表示Parent,Row1~N表示Child,程式碼中都有註解。
最近剛好需要實作展開/收合的功能,效果如圖所示:
我是參考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 |
全站熱搜