UITableView和html中的table有点类似的,也有header和footer和body,row。下面给出一个demo
//
// TableViewTestViewController.m
// iosstudy2024
//
// Created by figo on 2024/12/9.
//
#import "TableViewTestViewController.h"
@interface TableViewTestViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableViewTest;
@property(strong,nonatomic) NSMutableArray *data;
- (IBAction)addData:(id)sender;
- (IBAction)deleteData:(id)sender;
@end
@implementation TableViewTestViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.tableViewTest.dataSource=self;
self.tableViewTest.delegate=self;
NSArray *array=@[@"iphone",@"华为",@"小米",@"oppo",@"vivo"@"iphone",@"华为",@"小米",@"oppo",@"vivo",@"iphone",@"华为",@"小米",@"oppo",@"vivo"@"iphone",@"华为",@"小米",@"oppo",@"vivo"];
self.data=[NSMutableArray arrayWithArray:array];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
//tableViewCell 表格每一行
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
// UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"abc"];
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"abc"];
if(cell==nil){
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"abc"];
cell.imageView.image=[UIImage imageNamed:@"diamond"];
cell.textLabel.text=@"AAAAA";
cell.detailTextLabel.text= self.data[indexPath.row];
}
return cell;
}
//每段总行数
- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.data.count;
}
//总段数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
//头部标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return @"头部视图";
}
//尾部标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
return @"尾部视图";
}
//头部返回视图 会覆盖titleForHeaderInSection
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
int width=[UIScreen mainScreen].bounds.size.width;
UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
imgView.image=[UIImage imageNamed:@"star"];
UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(100, 0, 200, 50)];
label.text=@"这里是头部标题";
UIView *view=[[UIView alloc]init];
view.frame=CGRectMake(0, 0, width, 100);
view.backgroundColor=[UIColor systemPinkColor];
[view addSubview:imgView];
[view addSubview:label];
return view;
}
//尾部返回视图 会覆盖titleForFooterInSection
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
int width=[UIScreen mainScreen].bounds.size.width;
UIImageView *imgView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50,50)];
imgView.image=[UIImage imageNamed:@"diamond"];
UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(100, 0, 200, 50)];
label.text=@"这里是尾部标题";
UIView *view=[[UIView alloc]init];
view.frame=CGRectMake(0, 0, width, 100);
view.backgroundColor=[UIColor purpleColor];
[view addSubview:imgView];
[view addSubview:label];
return view;
}
//选中一行弹框效果
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *str=self.data[indexPath.row];
//创建一个UIAlertController对象
//P1:弹出框的标题 P2弹出框的内容
//P3:弹出的警告框的样式为UIAlertControllerStyleAlert(即中心弹出的警告框)
UIAlertController* alertController = [UIAlertController alertControllerWithTitle:@"标题" message:str preferredStyle:UIAlertControllerStyleAlert];
//添加“确认”动作按钮到控制器上
//P1:标题文字 P2:动作样式,有三种动作样式:常规(default)、取消(cancel)以及警示(destruective)
//P3:用户选中并点击该动作时,所执行的代码
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
// 用户点击确认按钮后执行的代码
}];
//将动作按钮添加到alertController视图上
[alertController addAction:defaultAction];
//添加“取消”动作按钮到控制器上
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
// 用户点击取消按钮后执行的代码
}];
//将动作按钮添加到alertController视图上
[alertController addAction:cancelAction];
//将警告框显示出来
[self presentViewController:alertController animated:YES completion:nil];
}
//每行能否编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
//提交编辑(增删)
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if(editingStyle==UITableViewCellEditingStyleDelete){
//删除数据源,这个必须排在前面
[self.data removeObjectAtIndex:indexPath.row];
//删除当前行 记得加上@ indexPath是个对象,UITableViewRowAnimationLeft表示从左移动
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];}
else if (editingStyle==UITableViewCellEditingStyleInsert){
//先增加数据源
[self.data insertObject:@"这里是新增的行" atIndex:indexPath.row];
//视图增加一行
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}
}
//设置删除按钮的文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"删除";
}
//设置tableView不可以编辑
- (IBAction)deleteData:(id)sender {
self.tableViewTest.editing=NO;
}
//设置tableView可以编辑
- (IBAction)addData:(id)sender {
self.tableViewTest.editing=YES;
}
//tableViewTest.editing=YES默认是删除,改成编辑
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if(self.tableViewTest.editing==YES){
return UITableViewCellEditingStyleInsert;
}else{
return UITableViewCellEditingStyleDelete;
}
}
//是否可以移动每一行
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
//1.需要移动的行的数据
NSString *celldata=self.data[sourceIndexPath.row];
//2.移除原始位置的数据
[self.data removeObjectAtIndex:sourceIndexPath.row];
//3.将原始位置的数据移动到目标位置
[self.data insertObject:celldata atIndex:destinationIndexPath.row];
}
@end