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


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






