UITableView表格操作
UITableView【表格视图】
UITableView是表格视图,是UIScrollView的子类,非常重要。
一、表格视图常用属性
1、基本属性方法
创建一个tableView
// UITableViewStylePlain, //扁平风格的
// UITableViewStyleGrouped //跟系统设置风格是一样的 分组风格
UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStyleGrouped];
表格的背景颜色
tableView.backgroundColor = [UIColor orangeColor];
如果根视图是导航视图控制器,则需要取消导航控制器对布局的影响
方法一:
//让导航条透明(原点坐标是从屏幕左上角开始的),scrollview(子类) 正常显示
self.automaticallyAdjustsScrollViewInsets = NO;
CGRect tableViewFrame = tableView.frame ;
tableViewFrame.origin.y += 64;
tableViewFrame.size.height -= 64;
tableView.frame = tableViewFrame;
方法二:
//取消导航视图控制器 对布局(第一个子视图是UIScrollview的子类)的影响
// 设置UIRectEdgeNone 之后,你发发现 self.view 零点是导航栏下边开始的
self.edgesForExtendedLayout = UIRectEdgeNone;
CGRect tableViewFrame = tableView.frame ;
tableViewFrame.size.height -= 64;
tableView.frame = tableViewFrame;
分割线的类型
UITableViewCellSeparatorStyleNone, 没有(一般情况下,做一些比较复杂cell 分割线是不显示,自己可以定制一条分割线)
UITableViewCellSeparatorStyleSingleLine,细线
UITableViewCellSeparatorStyleSingleLineEtched 没有
tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
分割线颜色
tableView.separatorColor = [UIColor redColor];
设置分割线边界的
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
tableview 的头视图 和 尾视图 是一个UIView类型的
tableView.tableHeaderView
tableView.tableFooterView
2、数据代理方法
UITableViewDataSource 数据源协议,告诉tableView 要显示多少行和每一行要显示内容
设置代理
tableView.dataSource = self;
代理方法必须实现的方法 (行数和内容)
//设置第section组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.dataSource[section] count];
}
//设置cell 内容(行内容)
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//创建一个cell
//第一个参数 cell的风格
//第二个参数 唯一标示符 用来复用cell的,怎么复用呢,只创建比我们能看到屏幕上cell 多一点,每当我们下滑动的时候,会多的cell 拿过来用。系统会创建一个复用的队列,每当需要创建cell的时候,会先去队列里面找有没有可用的cell(cellID是一样的),如果有可用的,就拿过来用,如果没有可用的cell,就直接创建一个。
//先检测复用队列,有没有可以用cell
static NSString *cellID = @"cellID";
//检测对应id 有没有对应的可用cell
UITableViewCell *reuseCell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (reuseCell == nil) {
不存在可以复用cell,就去创建一个
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
}
cell自带了一个label 和imageView
cell的类型:
UITableViewCellStyleDefault 有两个label
UITableViewCellStyleValue1,(系统的设置风格)
UITableViewCellStyleValue2,(跟系统联系人的风格相似)(图片不会显示)
UITableViewCellStyleSubtitle
NSString *name = self.dataSource[indexPath.section][indexPath.row];
cell.textLabel.text = name;
//设置图片
cell.imageView.image = [UIImage imageNamed:@"2"];
//详细信息label
cell.detailTextLabel.text = @"详细信息";
//cell的内容视图(放自定义控件)
cell.contentView.backgroundColor = [UIColor cyanColor];
//指示附加视图
cell.accessoryType = UITableViewCellAccessoryDetailButton;
//自己定制附加视图
cell.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"3"]];
附件视图被点中会调用协议方法
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
//点击cell之后的风格
// UITableViewCellSelectionStyleNone,
// UITableViewCellSelectionStyleBlue,
// UITableViewCellSelectionStyleGray,
// UITableViewCellSelectionStyleDefault
cell.selectionStyle = UITableViewCellSelectionStyleGray;
//设置选中的背景视图
UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor blueColor];
cell.selectedBackgroundView = selectedView;
return cell;
}
//设置tableview 有多少组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.dataSource.count;
}
//分组的 index title
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return @[@"a",@"b",@"b",@"c",@"c"];
}
//改变 点击index title 所 跳到的组
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
if ([title isEqualToString:@"a"]) {
return 4;
}
return index;
}
3、本身代理方法
设置行、头视图,尾视图的高
设置头视图和尾视图 返回值UIView
设置头视图和尾视图的title 返回NSString
选中某一行
////设置组头
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerSectionView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
headerSectionView.backgroundColor = [UIColor yellowColor];
return headerSectionView;
}
////设置组尾视图
- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
view.backgroundColor = [UIColor greenColor];
return view;
}
////设置组头高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 100;
}
////组尾高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return 100;
}
//设置组头title //粘性表头 tableview 的风格 必须是plain,组头组尾视图不能设置,系统默认的头尾视图。
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
//选了某一行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//可以选中进去之后,在出来,cell 就不被选中
[tableView deselectRowAtIndexPath:indexPath animated:YES];
将选中的行的信息在另一个视图显示
DetailViewController *dvc = [[DetailViewController alloc]init];
//点击的那一行的 名字
NSString *name = self.dataSource [indexPath.section][indexPath.row];
dvc.name = name;
[self.navigationController pushViewController:dvc animated:YES];
}
代理
tableView.delegate = self;
// tableview 是继承于UIScrollview·的,所以UIscrollView的协议方法,tableView都能用
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"scrollViewDidScroll");
}
二、表格视图的基本操作
1、 为了方便操作,创建了表格的基类,在基类中实现以后必须要用的方法(行,内容)和属型,必须在.h中声明属性和非类方法(后续需要不断使用的方法)
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *dataSource;
/**
* 创建数据源 子类取实现 需要重写
*/
- (void)createDataSource;
2、操作表格时需实现协议中的方法 对表格 提交编辑和 设置编辑(多行删除除外)
****************************************************************添加一行 AddCellViewController
(1) 首先,重写数据源 数据源单独作为一个类,创建多种数据源
- (void)createDataSource {
self.dataSource = [DataSourceStore createOPDataSource];
}
(2)根据数据源中数据存储的形式重写类方法cell
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *reusableCell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
reusableCell.textLabel.text = [NSString stringWithFormat:@"重写%@",self.dataSource[indexPath.row]] ;
return reusableCell;
}
(3)编辑表格
//编辑的风格
// UITableViewCellEditingStyleNone,
// UITableViewCellEditingStyleDelete,
// UITableViewCellEditingStyleInsert
// 提交编辑
//类方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleInsert) {
//首先要在数据源添加一个数据
[self.dataSource insertObject:@"添加的" atIndex:indexPath.row];
//刷新全部的数据
//[self.tableView reloadData];
//插入一行 刷新一行
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
else if (editingStyle == UITableViewCellEditingStyleDelete){
NSLog(@"删除");
}
}
//设置编辑风格
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleInsert;
}
****************************************************************删除一行 RemoveViewController
(1) 首先,重写数据源
(2 )编辑表格
//提交编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//先删除数据源的某个元素
[self.dataSource removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
//设置编辑类型
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleDelete;
}
//iOS8的新属性,自定义左滑cell按钮
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
//行动作
// UITableViewRowActionStyleDefault = 0,
// UITableViewRowActionStyleDestructive = UITableViewRowActionStyleDefault,
// UITableViewRowActionStyleNormal
UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"置顶" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"点击置顶按钮");
}];
UITableViewRowAction *action2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"点击删除按钮");
}];
return @[action1,action2];
}
**********************************************************************删除多行不需要编辑表格和提交编辑,需要直接重写item“编辑”的触发事件
(1) 首先,重写数据源
(2 )重写导航栏的“编辑”item的触发事件
//设置编辑
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
}
//用两个协议方法来记录选中和撤销
//撤销选中行
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
}
//选中行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//只有是编辑模式的时候我们才去几乎选中的行
if (tableView.isEditing) {
}
//有一个专门记录选中的行数
// tableView.indexPathsForSelectedRows;
// NSLog(@"%ld",tableView.indexPathsForSelectedRows.count);
}
- (void)itemPressed:(UIBarButtonItem*)item {
NSLog(@"强制重写");
if (self.tableView.isEditing) {
//在这里处理多选删除
//先删除数据源
//多选删除的时候必须要倒序删除
//1、先把数组里边的元素排序
NSArray *resultArray = [self.tableView.indexPathsForSelectedRows sortedArrayUsingSelector:@selector(compare:)];
//按照数组里边的内容 类型 compare: 方法进行排序,一般compare:都是从小到大排序
//逆序数组,首先逆序枚举,然后取出所有得元素
NSArray *reverseArray = [[resultArray reverseObjectEnumerator] allObjects];
for (NSIndexPath *indexpath in reverseArray) {
[self.dataSource removeObjectAtIndex:indexpath.row];
}
//刷新界面
[self.tableView deleteRowsAtIndexPaths:self.tableView.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
// self.tableView.editing = NO;
//带有动画效果
[self.tableView setEditing:NO animated:YES];
}
else {
//self.tableView.editing = YES;
[self.tableView setEditing:YES animated:YES];
}
}
***********************************************************************折叠FoldViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初始化数组状态,设置section全是关闭
self.sectionsState = [NSMutableArray arrayWithObjects:@0,@0,@0,@0, nil];
// Do any additional setup after loading the view.
}
- (void)createDataSource {
self.dataSource = [DataSourceStore createFlodDataSource];
}
//两个重要的协议
//行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSNumber *state = self.sectionsState[section];
//如果是关闭的,返回0;
if (state.intValue == 0) {
return 0;
}
else{
//只要是打开的就返回数组里面的元素个数
return [self.dataSource[section] count];
}
}
//内容
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellID = @"cellID";
UITableViewCell *reusableCell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (reusableCell == nil) {
reusableCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
reusableCell.textLabel.text = self.dataSource[indexPath.section][indexPath.row];
return reusableCell;
}
//组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self.dataSource count];
}
//设置组头
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIButton *headerView = [UIButton buttonWithType:UIButtonTypeSystem];
headerView.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
[headerView setTitle:@"我的好友" forState:UIControlStateNormal];
headerView.backgroundColor = [UIColor greenColor];
[headerView addTarget:self action:@selector(headerViewPressed:) forControlEvents:UIControlEventTouchUpInside];
headerView.tag = section + 100;
return headerView;
}
- (void)headerViewPressed:(UIButton*)sender {
NSInteger section = sender.tag - 100;
BOOL state = [self.sectionsState[section] boolValue];
//修改数据源
NSNumber *currentState = state?@0:@1;
//如果是关着的就设置现在的状态为开,反之一样
[self.sectionsState replaceObjectAtIndex:section withObject:currentState];
//刷新对应的section
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
//NSLog(@"点击了%ld头视图",section);
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 44.0;
}
****************************************************************** 移动 MoveViewController
(1) 首先,重写数据源
(2 )设置行可以移动
//让表格可以移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleNone;
}
(3 )移动表格的行
//移动表格的协议方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
//改变数据源
[self.dataSource exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
}
*******************************************************************搜索 SearchViewController
首先必须遵守的两个协议UISearchBarDelegate,UISearchDisplayDelegate
为了方便使用,设置三个属性
@property (nonatomic, strong) UISearchBar *searchBar; 搜索栏
@property (nonatomic, strong) UISearchDisplayController *searchDC; 显示搜索结果
@property (nonatomic, strong) NSMutableArray *resultArray; 存放搜索的结果
(1)首先,创建视图,将搜索栏添加到表格的 表头 并设置协议的代理
- (void)createView {
_searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 44.0)];
_searchBar.placeholder = @"请输入";
self.tableView.tableHeaderView = _searchBar;
_searchDC = [[UISearchDisplayController alloc]initWithSearchBar:_searchBar contentsController:self];
_searchDC.searchResultsDelegate = self;
_searchDC.searchResultsDataSource= self;
}
(2)创建数据源
(3)实现tableView必须实现的两个协议方法(重写行数和内容)
’
//行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == self.tableView) {
return [self.dataSource count];
}
else{
//说明是searchBar的tableView
// //拿到搜索结果
// //谓词搜索
// //查询后面的字符串是否包含搜索内容
// NSPredicate *pd = [NSPredicate predicateWithFormat:@"self contains[cd]%@",_searchBar.text];
// //在我们的数据源查找
// NSArray *array1 = [self.dataSource filteredArrayUsingPredicate:pd];
// self.resultArray = [NSMutableArray arrayWithArray:array1];
//
// return self.resultArray.count ;
//第二种方法 ios8以后才能用
self.resultArray = [NSMutableArray new];
for (NSString *item in self.dataSource) {
BOOL contains = [item containsString:_searchBar.text];
if (contains) {
//只要包含 就添加到结果里边
[_resultArray addObject:item];
}
}
return self.resultArray.count;
}
}
//搜索内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellID = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
if (tableView == self.tableView) {
cell.textLabel.text = self.dataSource[indexPath.row];
}
else {
//就是我们的searchBar的tableView视图
cell.textLabel.text = self.resultArray[indexPath.row];
}
return cell;
}
UITableView表格操作的更多相关文章
- UITableView表格视图、UITableView代理方法及应用
一.基本知识点 UITableView表格视图,是一个可以滚动的界面(理解为垂直滚动的UIScrollView),可展示多行数据,没有行数的限制,只能有一列. 使用UITableView: 1.展示信 ...
- 【jQuery基础学习】04 jQuery中的表格操作及cookie插件的使用
这章本来准备写成jQuery的表单操作和表格操作的. 然而昨天吧jQuery的表单操作看完,发现全部在炒之前章节的剩饭,所以就没写出来. 那么今天就来看看表格吧. 因为平常做的都是公司的内部管理系统, ...
- [办公应用]我的WORD文档表格操作不灵活 无法调整列宽
最近同事的一个word文档中的表格操作非常不灵活,用鼠标直接调整列宽时总觉得很不灵活.她的操作系统为XP,office 为微软office 2003. 我首先检查了木马,检查了输入法等,结果都没有问题 ...
- 原生js封装table表格操作,获取任意行列td,任意单行单列方法
V1.001更新增加findTable-min.js 本次更新,优化了代码性能方面,增加了部分新功能,可以获取多个table表格批量操作. 考虑到本人后面的项目中可能涉及到大量的表格操作,提前先封了 ...
- DOM表格操作
注意:就算代码中不包含<tbody>标签,浏览器解析时也可能会自动添加,因此需要注意子元素的选择 表格操作用到的属性: 1.tHead 2.tBodies 3.tFoot 更为细致的有: ...
- 这些HTML、CSS知识点,面试和平时开发都需要 No10-No11(知识点:表格操作、代码编写规则)
系列知识点汇总 1.基础篇 这些HTML.CSS知识点,面试和平时开发都需要 No1-No4(知识点:HTML.CSS.盒子模型.内容布局) 这些HTML.CSS知识点,面试和平时开发都需要 No5- ...
- .Net Core NOPI操作word(二) 表格操作
一.创建表格操作 private void btnExport_Click(object sender, EventArgs e) { var dbcontext = new BlogModel(); ...
- js 表格操作----添加删除
js 表格操作----添加删除 书名:<input type="text" id="name"> 价格:<input type="t ...
- 在MVC模式下通过Jqgrid表格操作MongoDB数据
看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...
随机推荐
- hr定位
css里写 <style> hr{ position:relative; top: 500px; } </style> 重要!!! hr不能绝对定位, 只能相对定位,所以 hr ...
- Inno Setup入门(十九)——Inno Setup类参考(5)
: Install Setup 2013-02-02 11:29 377人阅读 评论(0) 收藏 举报 单选按钮 单选按钮在安装中也很常见,例如同一个程序可以选择安装不同的性质的功能,例如选择32位或 ...
- 笨方法学python--安装和准备
1 下载并安装python http://python.org/download 下载python2.7. python2.7并不是python3.5的旧版本. python2现在应用较广,网上资料较 ...
- label自适应
//label自适应 self.label = [UILabel new]; self.label.font = [UIFont systemFontOfSize:14]; NSString *tit ...
- WPF 常用样式
TextBox <Window x:Class="WpfDemo.ListBoxTemaple" xmlns="http://schemas.microsoft.c ...
- php 10.2总
注意事项 获取表单信息 <?php if($_POST["submit"]=="登录"){ echo "您输入的用户名为:".$_PO ...
- lucene中Field.Index,Field.Store的一些设置
lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZE ...
- hdu 3345 War Chess
War Chess Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- hashmap源码
Java里各种基础容器的实现都是链表外加引用的形式.So,hashmap也不例外. 那小考虑下:hashmap是怎么产生的呢? 常用的两种数据结构数组和链表各有优劣,数组寻址容易,插入和删除困难:而链 ...
- CodeForces 190D Non-Secret Cypher
双指针. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...