How to expand and collapse rows using header section in a UITableView

前端 未结 4 1630
心在旅途
心在旅途 2020-12-14 14:08

I have a table view. Now I want to collapse and expand rows by tapping on the section header. In other words, when I tap the header the rows display for that section. How ca

4条回答
  •  眼角桃花
    2020-12-14 14:33

    TLIndexPathTools does this with only a few lines of code on your part. Try running the Collapse sample project. It subclasses TLCollapsibleTableViewController, which has a couple of nice options. It supports expanding a single section at a time or multiple sections. It also optimizes the scroll position when you expand a section to show as many rows of the section as possible. So if you tap on a section near the bottom of the screen, it will scroll up automatically.

    The full view controller code of the sample project is as follows:

    #import "TLCollapsibleTableViewController.h"
    
    @interface CollapseTableViewController : TLCollapsibleTableViewController
    - (IBAction)toggleSingleSectionExpanded:(UISwitch *)sender;
    @end
    
    #import "CollapseTableViewController.h"
    #import "TLIndexPathSectionInfo.h"
    #import "TLCollapsibleDataModel.h"
    
    #define SECTION1_NAME @"Section 1"
    #define SECTION2_NAME @"Section 2"
    
    @interface CollapseTableViewController ()
    @property (strong, nonatomic) TLIndexPathDataModel *backingDataModel;
    @end
    
    @implementation CollapseTableViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        //define items for two sections
        NSArray *section1Items = @[
                                   @"Fredricksburg",
                                   @"George Washington",
                                   @"Grand Canyon"];
        NSArray *section2Items = @[
                                   @"Jelly Bean",
                                   @"Bibliography",
                                   @"Keyboard Shortcut",
                                   @"Metadata",
                                   @"Fundamental",
                                   @"Cellar Door"];
    
        //We're using plain string items, so we don't have a sectionNameKeyPath property
        //to use, so instead we explicitly create section info objects
        TLIndexPathSectionInfo *section1 = [[TLIndexPathSectionInfo alloc] initWithItems:section1Items andName:SECTION1_NAME];
        TLIndexPathSectionInfo *section2 = [[TLIndexPathSectionInfo alloc] initWithItems:section2Items andName:SECTION2_NAME];
    
        //create the backing model, which contains all sections and items
        self.backingDataModel = [[TLIndexPathDataModel alloc] initWithSectionInfos:@[section1, section2]
                                                                               andIdentifierKeyPath:nil andCellIdentifierKeyPath:nil];
    
        [self collapseAll];
    }
    
    - (void)tableView:(UITableView *)tableView configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
    {
        NSString *item = [self.dataModel itemAtIndexPath:indexPath];
        cell.textLabel.text = item;
    }
    
    - (IBAction)toggleSingleSectionExpanded:(UISwitch *)sender {
        self.singleExpandedSection = sender.isOn;
        [self collapseAll];
    }
    
    - (void)collapseAll
    {
        self.dataModel = [[TLCollapsibleDataModel alloc] initWithBackingDataModel:self.backingDataModel
                                                            collapsedSectionNames:[NSSet setWithArray:self.backingDataModel.sectionNames]];
    }
    
    @end
    

提交回复
热议问题