UITableView的展开与收缩

一.前言

在我们写程序时,总有些功能是需要UITableView的展开与折叠才能达到其想要的目的,所以在此写这篇博客作为笔记。

二.思路

1.重写UITableViewCell,可以按照自己的需求进行相应的重写。
2.在一个可变的数组的长度作为UITableView返回的行数,达到UITableViewCell行数可变的目的。
3.创建一个BOOL类型的属性,作为UITableView展开和收缩的判断值,在创建一个UIButton并添加事件来改变该BOOL类型的属性即控制UITableView的展开和收缩。
4.将UITableView添加到视图上,在需要展开的时候对其frame进行位置初始化,在收缩的时候将其的frame赋值为CGRectZero,它就不会显示在视图上。

三.下面是程序的具体代码

自定义cell,这里我只添加了UILabel,可根据自己的需求进行相应的改变

LabelTableViewCell.h

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface LabelTableViewCell : UITableViewCell

@property (nonatomic, strong) UILabel *showLabel;

@end

NS_ASSUME_NONNULL_END

LabelTableViewCell.m

#import "LabelTableViewCell.h"

@implementation LabelTableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if ([self.reuseIdentifier isEqualToString:@"show"]) {
        self.showLabel = [[UILabel alloc] init];
        self.showLabel.font = [UIFont systemFontOfSize:30];
        self.showLabel.textAlignment = NSTextAlignmentCenter;
        [self.contentView addSubview:self.showLabel];
    }
    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    self.showLabel.frame = CGRectMake(0, 0, 300, 50);
}

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UIButton *button;
@property (nonatomic, strong) UITableView *tableView;
@property BOOL openClose;
@property (nonatomic, strong) NSMutableArray *array;

@end

ViewController.m

#import "ViewController.h"
#import "LabelTableViewCell.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.view.backgroundColor = [UIColor orangeColor];
    
    [self creatView];
}

- (void)creatView {
    self.openClose = 0;
    
    self.array = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
    
    self.button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [self.button setTitle:@"点击展开" forState:UIControlStateNormal];
    [self.button addTarget:self action:@selector(pressButton:) forControlEvents:UIControlEventTouchUpInside];
    self.button.frame = CGRectMake(50, 200, 300, 50);
    self.button.titleLabel.font = [UIFont systemFontOfSize:28];
    self.button.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:self.button];
    
    self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
    
    [self.tableView registerClass:[LabelTableViewCell class] forCellReuseIdentifier:@"show"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    LabelTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"show" forIndexPath:indexPath];
    cell.showLabel.text = self.array[indexPath.row];
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.openClose == 0) {
        return 0;
    } else {
        return self.array.count;
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50;
}

- (void)pressButton:(UIButton *)button {
    if (self.openClose == 0) {
        self.tableView.frame = CGRectMake(50, 250, 300, 50 * self.array.count);
        [self.button setTitle:@"点击收缩" forState:UIControlStateNormal];
    } else {
        self.tableView.frame = CGRectZero;
        [self.button setTitle:@"点击展开" forState:UIControlStateNormal];
    }
    self.openClose = !self.openClose;
    [self.tableView reloadData];
}

@end

四.效果图

23
546

源代码地址:折叠cell

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在UITableView的section中添加数据,你需要先创建一个包含所需数据的数组。然后,在UITableViewDataSource协议中实现以下方法: 1. numberOfSections(in tableView: UITableView) -> Int:返回表格中的section数。 2. tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int:返回指定section中的行数。 3. tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell:返回指定indexPath的UITableViewCell实例。 例如,假设你有一个包含多个section的UITableView,每个section都包含一个字符串数组。以下是一个示例代码: ``` class ViewController: UIViewController, UITableViewDataSource { var data: [[String]] = [["item 1", "item 2"], ["item 3", "item 4", "item 5"]] @IBOutlet weak var tableView: UITableView! override func viewDidLoad() { super.viewDidLoad() tableView.dataSource = self } // MARK: - UITableViewDataSource func numberOfSections(in tableView: UITableView) -> Int { return data.count } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data[section].count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = data[indexPath.section][indexPath.row] return cell } } ``` 在这个例子中,我们创建了一个包含两个section的UITableView。每个section都有一个字符串数组,我们将其存储在data数组中。在numberOfSections方法中,我们返回data数组的数量,即section的数量。在tableView(_:numberOfRowsInSection:)方法中,我们返回特定section中的行数。最后,在tableView(_:cellForRowAt:)方法中,我们获取特定indexPath的字符串并将其显示在UITableViewCell中。 注意,在上述示例代码中,我们将UITableViewCell标识符设置为“Cell”,你需要确保在Storyboard或xib文件中对应的UITableViewCell的标识符也设置为“Cell”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值