Expand/collapse section in UITableView in iOS

前端 未结 17 1049
野的像风
野的像风 2020-11-22 08:49

Could somebody tell me the way to perform UITableView expandable/collapsible animations in sections of UITableView as below?

<

17条回答
  •  醉话见心
    2020-11-22 09:41

    I've used a NSDictionary as datasource, this looks like a lot of code, but it's really simple and works very well! how looks here

    I created a enum for the sections

    typedef NS_ENUM(NSUInteger, TableViewSection) {
    
        TableViewSection0 = 0,
        TableViewSection1,
        TableViewSection2,
        TableViewSectionCount
    };
    

    sections property:

    @property (nonatomic, strong) NSMutableDictionary * sectionsDisctionary;
    

    A method returning my sections:

    -(NSArray  * )sections{
    
        return @[@(TableViewSection0), @(TableViewSection1), @(TableViewSection2)];
    }
    

    And then setup my data soruce:

    -(void)loadAndSetupData{
    
        self.sectionsDisctionary = [NSMutableDictionary dictionary];
    
        NSArray * sections = [self sections];
    
        for (NSNumber * section in sections) {
    
        NSArray * sectionObjects = [self objectsForSection:section.integerValue];
    
        [self.sectionsDisctionary setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"visible" : @YES, @"objects" : sectionObjects}] forKey:section];
        }
    }
    
    -(NSArray *)objectsForSection:(NSInteger)section{
    
        NSArray * objects;
    
        switch (section) {
    
            case TableViewSection0:
    
                objects = @[] // objects for section 0;
                break;
    
            case TableViewSection1:
    
                objects = @[] // objects for section 1;
                break;
    
            case TableViewSection2:
    
                objects = @[] // objects for section 2;
                break;
    
            default:
                break;
        }
    
        return objects;
    }
    

    The next methods, will help you to know when a section is opened, and how to respond to tableview datasource:

    Respond the section to datasource:

    /**
     *  Asks the delegate for a view object to display in the header of the specified section of the table view.
     *
     *  @param tableView The table-view object asking for the view object.
     *  @param section   An index number identifying a section of tableView .
     *
     *  @return A view object to be displayed in the header of section .
     */
    - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    
        NSString * headerName = [self titleForSection:section];
    
        YourCustomSectionHeaderClass * header = (YourCustomSectionHeaderClass *)[tableView dequeueReusableHeaderFooterViewWithIdentifier:YourCustomSectionHeaderClassIdentifier];
    
        [header setTag:section];
        [header addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]];
        header.title = headerName;
        header.collapsed = [self sectionIsOpened:section];
    
    
        return header;
    }
    
    /**
     * Asks the data source to return the number of sections in the table view
     *
     * @param An object representing the table view requesting this information.
     * @return The number of sections in tableView.
     */
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        // Return the number of sections.
    
        return self.sectionsDisctionary.count;
    }
    
    /**
     * Tells the data source to return the number of rows in a given section of a table view
     *
     * @param tableView: The table-view object requesting this information.
     * @param section: An index number identifying a section in tableView.
     * @return The number of rows in section.
     */
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    
        BOOL sectionOpened = [self sectionIsOpened:section];
        return sectionOpened ? [[self objectsForSection:section] count] : 0;
    }
    

    Tools:

    /**
     Return the section at the given index
    
     @param index the index
    
     @return The section in the given index
     */
    -(NSMutableDictionary *)sectionAtIndex:(NSInteger)index{
    
        NSString * asectionKey = [self.sectionsDisctionary.allKeys objectAtIndex:index];
    
        return [self.sectionsDisctionary objectForKey:asectionKey];
    }
    
    /**
     Check if a section is currently opened
    
     @param section the section to check
    
     @return YES if is opened
     */
    -(BOOL)sectionIsOpened:(NSInteger)section{
    
        NSDictionary * asection = [self sectionAtIndex:section];
        BOOL sectionOpened = [[asection objectForKey:@"visible"] boolValue];
    
        return sectionOpened;
    }
    
    
    /**
     Handle the section tap
    
     @param tap the UITapGestureRecognizer
     */
    - (void)handleTapGesture:(UITapGestureRecognizer*)tap{
    
        NSInteger index = tap.view.tag;
    
        [self toggleSection:index];
    }
    

    Toggle section visibility

    /**
     Switch the state of the section at the given section number
    
     @param section the section number
     */
    -(void)toggleSection:(NSInteger)section{
    
        if (index >= 0){
    
            NSMutableDictionary * asection = [self sectionAtIndex:section];
    
            [asection setObject:@(![self sectionIsOpened:section]) forKey:@"visible"];
    
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
        }
    }
    

提交回复
热议问题