要在表格视图内实现可展开视图,可以使用UITableViewController和UITableViewDelegate、UITableViewDataSource协议来实现。
首先,创建一个UITableViewController子类,命名为ExpandableTableViewController。在.h文件中声明一个名为expandedIndexPath的实例变量来记录当前展开的行。
#import
@interface ExpandableTableViewController : UITableViewController
@property (nonatomic, strong) NSIndexPath *expandedIndexPath;
@end
接下来,在.m文件中实现UITableViewDelegate和UITableViewDataSource协议的方法。
#import "ExpandableTableViewController.h"
@implementation ExpandableTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化expandedIndexPath为nil
self.expandedIndexPath = nil;
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// 返回表格的行数
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
// 设置单元格的标题
cell.textLabel.text = [NSString stringWithFormat:@"Row %ld", (long)indexPath.row];
return cell;
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// 检查当前行是否已展开,如果是,则关闭
if ([indexPath isEqual:self.expandedIndexPath]) {
self.expandedIndexPath = nil;
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
return;
}
// 展开前一个已展开的行
if (self.expandedIndexPath != nil) {
NSIndexPath *previousExpandedIndexPath = self.expandedIndexPath;
self.expandedIndexPath = nil;
[tableView reloadRowsAtIndexPaths:@[previousExpandedIndexPath] withRowAnimation:UITableViewRowAnimationFade];
}
// 展开当前行
self.expandedIndexPath = indexPath;
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// 如果该行为展开状态,则返回更大的高度,否则返回默认高度
if ([indexPath isEqual:self.expandedIndexPath]) {
return 100.0;
} else {
return 44.0;
}
}
@end
在上述代码中,我们通过设置expandedIndexPath来记录当前展开的行的位置。当用户点击某一行时,我们检查该行是否已经展开,如果是,则关闭该行;如果不是,则关闭之前已展开的行并展开当前行。
在展开行的方法中,我们使用UITableView的reloadRowsAtIndexPaths:withRowAnimation:方法来重新加载行。在高度方法中,我们根据行是否展开返回不同的高度。
最后,在其他地方创建一个UITableView实例,并将其代理和数据源设置为ExpandableTableViewController的实例。
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
ExpandableTableViewController *tableViewController = [[ExpandableTableViewController alloc] init];
tableView.delegate = tableViewController;
tableView.dataSource = tableViewController;
[self.view addSubview:tableView];
通过以上代码,你可以实现在表格视图内的可展开视图。
上一篇:表格视图宽度基于行数问题
下一篇:表格视图内收集视图边缘重叠标签