实现:QQ好友列表程序
源代码下载地址:点击打开链接
1、静态单元格
直接在Storyboard中拖,注意改成静态,只适用于界面长期不变的情况,实际中很少使用,基本都是代码实现,了解即可。
2、QQ好友列表实现要求
3、QQ好友列表实现思路
3.1 嵌套式模型
观察其plist文件可知,属于嵌套式模型,参考车牌列表程序 – 嵌套式模型。
3.2 基本界面搭建
1> 将ViewController继承自UITableViewController
2> 懒加载数据模型,并简单打印测试
3> 初步实现dataSource数据源方法,简单测试
4> 隐藏状态栏
5> 设置header的title和height
以上完成的效果和车牌列表程序一致
3.3 设置headerView --- 重要
1> 设置headerView的代理方法
注:也要使用可重用标识符
2> 注意:所有UIView当只是做了init操作的时候,然后马上取出其frame,此时这个frame的值都为0。
注:此时header的bounds值均为 0
3> 代码自定义headerView --- 重要
注:对比之前团购界面程序中,使用XIB自定义footerView
1. 类方法返回一个自定义headerView,注意需要可重用标识符
2. 重写- (id)initWithReuseIdentifier:(NSString*)reuseIdentifier
3. 由于init直接取出的frame为0,需重写- (void)layoutSubviews设置位置
4. 自定义headerView添加HMFriendsGroup模型属性,添加setter方法
5. headerView中的按钮添加监听方法
注:要添加监听方法,必须使用[self addSubView:],不能使用[self.contentViewaddSubView:]
3.4 点击headerView打开/合上相应列表 --- 重要
实现思路:显示0条Cell相当于合上!
1> 在HMFriendGroup中添加一个BOOL属性表征是否打开
2> 在自定义headerView中的按钮监听方法中改变上述打开属性
3> 在ViewController中的dataSource的返回每个section的row代理方法中根据是否打开返回相应row
4> 通知控制器刷新列表!!!
3.5 视图通知控制器做一些事情的三种方法:--- 重要
1> 自定义headerView添加一个代理属性,并让控制器成为其代理,在代理中方法中让tableView重新刷新数据reloadData
2> 代码块(步骤类似于代理)
1. 在View中定义一个block:typedef void(^HMHeaderViewBlock)(id);
2. @property (nonatomic, copy)HMHeaderViewBlock block;
3. 在控制器中实现block
4. 在View中的按钮点击事件中,通知block
if (self.block) {
self.block(self);
}
3> 通知中心
1. 在ViewController中添加观察者,监听通知
2. 在View中按钮点击后发布一个通知3. 在ViewController中实现响应
4. 在ViewController中的dealloc方法中取消注册
[[NSNotificationCenter defaultCenter] removeObserver:self];
3.6 打卡/合上的时候图片转动
1> 注意:不能在按钮点击的时候去改变headerView中的ImageView的transform属性,因为之后会重新加载数据,即先清空列表(翻转的图片已经清掉),再去缓存池加载tableView中的Cell和headerView,因此不会有变化
2> 应该重写-(void)didMoveToSuperview
3> 此时翻转的话会导致箭头变形
修改如下:
//居中显示
btn.imageView.contentMode = UIViewContentModeCenter;
//不予许剪切超出部分
btn.imageView.clipsToBounds = NO;