IOS初级:UITableView
先来看一下tableview 的结构(plain style)。
-------------------------------------- +
header table header
-------------------------------------- +
-------------------------------------- +
section header
--------------------------------------
cell
-------------------------------------- table section
cell
--------------------------------------- +
section footer
--------------------------------------- +
--------------------------------------- +
footer talbe foot
--------------------------------------- +
1、首先要在 UITableViewController 的 viewDidLoad方法中设置 self.tableView.sectionHeaderHeight的值,不然你不会看到section的数据的。
2、在UITableViewController 的numberOfSectionsInTableView方法中返回section的个数。
3、在UITableViewController 的(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中设置cell中的数据。
static NSString *identifier = @"dataCell";//这个用于cell种类的标识
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; //按identifier查找可重用cell。也就是系统要是有identifier类型的cell给你用,就返回这个可用的cell给你,否则返回nil
if (!cell) {//如果没有
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];//老子新建一个 }
DataGroupModel *groupModel = self.dataArray[indexPath.section]; //这里的dataArray可以是一个NSMutableArray,包含二级数据,第一级group用于section,第二级data用于cell
DataModel *dataModel = groupModel.data[indexPath.row]; //定为到group的data级数据
cell.imageView.image = [UIImage imageNamed:dataModel.icon];//这里cell的imageView等成员是UITableViewCell自己带的
cell.textLabel.text = dataModel.name;
cell.detailTextLabel.text = dataModel.detail; return cell;
4、接下来我们来设置section,我们用一个自定义的UIView类型的对象来作为section的header,也就是表头<th>。
4.1、在UITableViewController 的(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section方法中指定view。
HeaderView *header = [HeaderView headerView:tableView];//这里的HeaderView是我们自己定义的一个继承UITableViewHeaderFooterView的类
header.delegate = self; //设置header对象delegate为当前控制器
header.groupModel = self.dataArray[section];//设置header对象groupModel成员为某个二级数组
return header;//返回UIView *
4.2、接着我们定义HeaderView这个类
HeaderView.h
@protocol HeaderViewDelegate <NSObject> @optional
- (void)clickView; //首先定义一个代理方法,让TableViewController取实现,点击section的header时候要显示cell @end @interface HeaderView : UITableViewHeaderFooterView
@property (nonatomic, assign) id<HeaderViewDelegate> delegate;//有protocol的代理,肯定要有这个代理了 @property (nonatomic, strong) JKGroupModel *groupModel;//单个section的group数据
+ (instancetype)headerView:(UITableView *)tableView;//声明类的getter方法,这里说明一下instancetype,这个数据类型在这个类里就是HeaderView *,也就是self的数据类型,但这个instancetype只能做返回值,不能做参数类型。
@end
HeaderView.m
@implementation HeaderView{//我们先定义一些全局变量,全局变量也能这样写?
UIButton *_arrowBtn;
UILabel *_label;
}
//重写initWithReuseIdentifier
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super init]) {//先让父类自己搞他自己的那一套初始化
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];//我们定义一个UIButton,在UIButton上面自己实现怎么显示数据
[button setBackgroundImage:[UIImage imageNamed:@"header_bg"] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:@"header_bg_highlighted"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"arrow"] forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
button.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
button.imageView.contentMode = UIViewContentModeCenter;
[button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];//点击section的header时,应该显示cell或者收起cell
button.imageView.clipsToBounds = NO;
_arrowBtn = button;
[self addSubview:_arrowBtn];//添加到视图
//创建label,显示当前在线人数
UILabel *labelRight = [[UILabel alloc] init];
labelRight.textAlignment = NSTextAlignmentCenter;
_label = labelRight;
[self addSubview:_label];//添加到视图
}
return self;
}
//点击section的header时,应该显示cell或者收起cell
- (void)buttonAction{
self.groupModel.isOpen = !self.groupModel.isOpen;
if ([self.delegate respondsToSelector:@selector(clickView)]) {//respondsToSelector这个方法是查找clickView是否存在
[self.delegate clickView];//delegate的方法clickView的实现在TableViewController里
}
}
//下面是一下布局和图像的东西didMoveToSuperview,layoutSubviews,setGroupModel,这里先不讲
- (void)didMoveToSuperview{
_arrowBtn.imageView.transform = self.groupModel.isOpen ? CGAffineTransformMakeRotation(M_PI_2) :CGAffineTransformMakeRotation(0);
}
//布局
- (void)layoutSubviews{
[super layoutSubviews];
_arrowBtn.frame = self.bounds;
_label.frame = CGRectMake(self.frame.size.width - 70, 0, 60, self.frame.size.height);
}
//赋值
- (void)setGroupModel:(JKGroupModel *)groupModel{
_groupModel = groupModel;
[_arrowBtn setTitle:_groupModel.name forState:UIControlStateNormal];
_label.text = [NSString stringWithFormat:@"%@/%lu",_groupModel.online,(unsigned long)_groupModel.friends.count];
}
5、这里我们实现一下HeaderView中声明的一个代理clickView
- (void)clickView{
[self.tableView reloadData];//这个reloadData会重新执行所有的UITableView显示类方法,相当刷新这个UITableView
}
6、这里我们实现点击 cell的时候push到一个视图,这里没有太多说明了
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
ViewController *viewCtrl = [[ViewController alloc] init];
[self.navigationController pushViewController:viewCtrl animated:NO];
}
7、这里我们实现用一个TableFooterView盖住多余的section线。
- (void)clipExtraCellLine:(UITableView *)tableView{
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor clearColor];
[self.tableView setTableFooterView:view];
}
IOS初级:UITableView的更多相关文章
- iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)
iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath 首先分析有几种原因,以及相应的解决方法 1.UITableViewCell的userInterac ...
- Unity3D for iOS初级教程:Part 3/3
转自Unity 3D for iOS 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这份教程是由教程团队成员 ...
- iOS programming UITableView and UITableViewController
iOS programming UITableView and UITableViewController A UITableView displays a single column of dat ...
- Unity3D for iOS初级教程:Part 3/3(上)
转自:http://www.cnblogs.com/alongu3d/archive/2013/06/01/3111738.html 欢迎来到第三部分,这是Unity 3D for iOS初级系列教程 ...
- iOS之UITableView组头组尾视图/标题悬停
最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和fo ...
- iOS 编辑UITableView(根据iOS编程编写)
上个项目我们完成了 JXHomepwner 简单的应用展示,项目地址.本节我们需要在上节项目基础上,增加一些响应用户操作.包括添加,删除和移动表格. 编辑模式 UITableView 有一个名为 e ...
- 【IOS】从android角度来实现(理解)IOS的UITableView
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3403124.html 本人从在学校开始到现在上班(13年毕 ...
- iOS 关于UITableView的dequeueReusableCellWithIdentifier
今天看代码的时候,突然想到了以前的一个问题. 刚学ios那会儿,常会写出以下代码 - (UITableViewCell *)tableView:(UITableView *)tableView cel ...
- iOS开发 UITableView之cell
1.cell简介 UITableView的每一行都是一个UITableViewCell,通过dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行 U ...
随机推荐
- linux 根据服务名称批量杀死进程
ps -ef |grep python |awk '{print $2}'|xargs kill -9
- mac通过命令行获取证书和配置文件过期时间
背景:ios打包证书的profile配置文件过期了,导致以前已经打完的测试包不能安装.所以需要加上检测机制,在打包时提示证书是否将要过期,如果要过期了给出提示 方案: 1.查找profile配 ...
- centos 6 KVM 网卡桥接配置
一. 网卡桥接前准备 1.软件支持: # rpm -qa bridge-utils # yum install bridge-utils 确保软件包已安装 2. 关闭NetworkMana ...
- Linux 向文件末尾追加命令
Linux 向文件末尾追加命令 //echo后边用单引号包围要添加的内容 echo 'add content'>>/home/data/test.sh 注意:>> 是追加 ec ...
- 164. Maximum Gap (Array; sort)
Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...
- Codeforces Beta Round #63 (Div. 2)
Codeforces Beta Round #63 (Div. 2) http://codeforces.com/contest/69 A #include<bits/stdc++.h> ...
- 微信小程序接入百度统计
一. 百度统计添加应用,获取appkey和微信小程序统计sdk: 1. 百度统计首页,点击“我的全部应用”右侧的添加按钮: 2. “应用类型”选择小程序统计,选择微信小程序,填写应用名称信息,选择内容 ...
- mvc下添加 EntityFramework的引用
首先 打开工具-扩展和更新-联机-Visual Studio库,找到NuGet Package Manager 检查是否 安装,如果没有安装 先安装插件 安装成功后,右键点击‘引用’,如下图 然后 ...
- how2j网站前端项目——天猫前端(第一次)学习笔记1
首先是公共页面的学习,有页头.页脚和搜索框. 一.页头就是天猫网站的置顶导航栏: 看似简单,实际做起来也不容易. 写html还是比较简单的,撸起袖子就可以写完.可要想做到上图的样式就难了,难就难在CS ...
- 有关https有的网站可以访问有的访问不了的问题
在开发中遇到这种情况,在开发工具里面访问可以,当时到了手机上之后就发现有的请求可以正常获取数据,有的则不行. 都是使用https地址,也配置后台了,但是就是不出数据,总是无法请求服务. 后来检查在手机 ...