AJ分享,必须精品

先看效果图


自定义Cell

 本次主要是自定义Cell的学习
实现自定义Cell主要有三种方法:按照使用的频繁度排序:
XIB > 纯代码 > StoryBoard

XIB的定义步骤

1> 新建HMTgCell.xib
2> 拽一个需要自定义的控件,摆放其他子控件
3> 新建一个类
* 类名要与XIB的名字保持一致
* 继承自的子类要与XIB中的根节点的类型一致
4> 要连线之前,需要将XIB的根节点类名修改为刚刚新建的类名
5> 连线
6> 在XIB的属性面板,指定可重用标示符


代码学习

首先加载字典神马的这些大家自己去代码里看吧,前面写了太多了。

调整上边栏


// 调整边距,可以让表格视图让开状态栏
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

同等效果的:

/** 隐藏状态栏 */
- (BOOL)prefersStatusBarHidden
{
return YES;
}

数据源方法 把Cell放进去

#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.tgs.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1. 创建cell
HMTgCell *cell = [HMTgCell cellWithTableView:tableView]; // 2. 通过数据模型,设置Cell内容,可以让视图控制器不需要了解cell内部的实现细节
cell.tg = self.tgs[indexPath.row]; return cell;
}

+ (instancetype)cellWithTableView:(UITableView *)tableView
{
// 1. 可重用标示符
static NSString *ID = @"Cell";
// 2. tableView查询可重用Cell
HMTgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3. 如果没有可重用cell
if (cell == nil) {
NSLog(@"加载XIB");
// 从XIB加载自定义视图
cell = [[[NSBundle mainBundle] loadNibNamed:@"HMTgCell" owner:nil options:nil] lastObject];
} return cell;
} - (void)setTg:(HMTg *)tg
{
// setter方法中,第一句要赋值,否则要在其他方法中使用模型,将无法访问到
_tg = tg; self.titleLabel.text = tg.title;
self.iconView.image = [UIImage imageNamed:tg.icon];
self.priceLabel.text = tg.price;
self.buyCountLabel.text = tg.buyCount;
}

注意在自己的xib中class要选好了,然后连线才能给力


模板提供的方法

#pragma mark - 模板提供的方法
/**
初始化方法 使用代码创建Cell的时候会被调用,如果使用XIB或者Storyboard,此方法不会被调用
*/
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
NSLog(@"%s", __func__);
}
return self;
} /**
从XIB被加载之后,会自动被调用,如果使用纯代码,不会被执行
*/
- (void)awakeFromNib
{
NSLog(@"%s", __func__);
self.contentView.backgroundColor = [UIColor clearColor];
} /**
Cell 被选中或者取消选中是都会被调用 如果是自定义Cell控件,所有的子控件都应该添加到contentView中
*/
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated]; if (selected) {
self.contentView.backgroundColor = [UIColor redColor];
} else {
self.contentView.backgroundColor = [UIColor greenColor];
}
}

定义代理给页脚按钮实现功能(模拟网络下载)

首先在点h里面写入协议

#import <UIKit/UIKit.h>
@class HMTgFooterView; @protocol HMTgFooterViewDelegate <NSObject> @optional
/** 视图的下载按钮被点击 */
- (void)tgFooterViewDidDownloadButtonClick:(HMTgFooterView *)footerView; @end @interface HMTgFooterView : UIView // 代理如果使用强引用,就会产生循环引用,造成控制器和子视图都无法被释放,造成内存泄露
@property (nonatomic, weak) id <HMTgFooterViewDelegate> delegate; + (instancetype)footerView; /** 刷新数据结束后,更新页脚的视图显示 */
- (void)endRefresh; @end

点m文件的代码

//
// HMTgFooterView.m
// 02-团购
//
// Created by apple on 14-8-21.
// Copyright (c) 2014年 itcast. All rights reserved.
// #import "HMTgFooterView.h" @interface HMTgFooterView()
@property (weak, nonatomic) IBOutlet UIButton *loadMoreButton;
@property (weak, nonatomic) IBOutlet UIView *tipsView;
@end @implementation HMTgFooterView + (instancetype)footerView
{
return [[[NSBundle mainBundle] loadNibNamed:@"HMTgFooterView" owner:nil options:nil] lastObject];
} - (IBAction)loadMore
{
NSLog(@"加载更多");
// 1. 隐藏按钮
self.loadMoreButton.hidden = YES;
// 2. 显示提示视图
self.tipsView.hidden = NO; // 3.1 判断代理是否实现了协议方法
if ([self.delegate respondsToSelector:@selector(tgFooterViewDidDownloadButtonClick:)]) {
[self.delegate tgFooterViewDidDownloadButtonClick:self];
}
} /** 视图控制器刷新完成调用方法 */
- (void)endRefresh
{
// 4. 加载完成数据
self.loadMoreButton.hidden = NO;
self.tipsView.hidden = YES;
} @end

代理的具体实现由control来实现,然后通知他

- (void)tgFooterViewDidDownloadButtonClick:(HMTgFooterView *)footerView
{
// 模拟取网络上获取数据加载数据
NSLog(@"努力加载数据中...."); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 获得网络数据之后执行的操作 // 向数组中添加数据,模拟网络加载完成之后的效果
NSDictionary *dict = @{@"title": @"哈哈", @"icon": @"ad_00", @"price": @"100.2", @"buyCount": @"250"};
HMTg *tg = [HMTg tgWithDict:dict]; NSLog(@"加数据前 %d", self.tgs.count); [self.tgs addObject:tg]; NSLog(@"加数据后 %d", self.tgs.count);
// 刷新数据
// [self.tableView reloadData];
// 新建一个indexPath
NSIndexPath *path = [NSIndexPath indexPathForRow:(self.tgs.count - 1) inSection:0];
[self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle]; // 通知页脚视图调整视图显示状态
[footerView endRefresh];
}); }
  • footView => controller 去工作,使用代理
  • controller => footView 去工作,直接调用footView的方法即可

设置头部猜你喜欢上下的两道线

这东西很简单,就是一个自定义的xib 那两道线就是两个高1个像素点得View,————苹果官方也是这么搞得,所以就不要质疑啦。

    self.tableView.tableHeaderView = [[[NSBundle mainBundle] loadNibNamed:@"HMTgHeadView" owner:nil options:nil] lastObject];


预处理指令#if 1的特殊用法

预处理指令
#if 0
所有代码都不会执行 #endif

可以看做事高功能的注释,这里不会让我们看到一片绿,但是也能起到注释的作用,如果想用这代码了 把0改成1,so easy!!

代理模式的特点

代理模式的特点:是父控件(视图控制器)监听子控件的事件,当子控件发生某些事情时,通知父控件工作!

AJ学IOS(16)UI之XIB自定义Cell实现团购UI的更多相关文章

  1. IOS xib在tableview上的简单应用(通过xib自定义cell)

    UITableView是一种常用的UI控件,在实际开发中,由于原生api的局限,自定义UITableViewCell十分重要,自定义cell可以通过代码,也可以通过xib. 这篇随笔介绍的是通过xib ...

  2. AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI

    AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...

  3. AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController

    AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...

  4. AJ学IOS(28)UI之Quartz2D简单介绍

    AJ分享,必须精品 iOS开发UI篇—Quartz2D简单介绍 什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : ...

  5. AJ学IOS(18)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复

    AJ分享,必须精品 先看图片 第一步完成tableView和Cell的架子的图 完善图片 键盘弹出设置后图片: 自动回复图: 粗狂的架子 tableView和Cell的创建 首相tableView为了 ...

  6. AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引

    AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...

  7. AJ学IOS(19)UI之QQ好友列表

    AJ分享,必须精品 先看效果图 哈哈,这次猫猫给来个动态的图片,这个看起来带劲 实现思路 首先建立模型 这里用到的是一个双层的模型. cell的实现 这里一看其实就知道是一个tableView,我们自 ...

  8. AJ学IOS(12)UI之UITableView学习(上)LOL英雄联盟练习

    AJ分享,必须精品 先看效果图 源代码 NYViewController的代码 #import "NYViewController.h" #import "NYHero. ...

  9. iOS深入学习(UITableView系列4:使用xib自定义cell)

    可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

随机推荐

  1. 大数据软件安装之Azkaban(任务调度)

    一.安装部署 1.安装前准备 1)下载地址:http://azkaban.github.io/downloads.html 2)将Azkaban Web服务器.Azkaban执行服务器.Azkaban ...

  2. hdu2612 又是迷宫系列

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/2612/ 题意:有两个人在地图上不同的位置,地图上由若干个餐厅,求两人能同时到达一个餐厅所用最少的总时间. 代码如 ...

  3. wr720n v4 折腾笔记(三):网络配置与扩充USB

    0x01 前言 网络配置比较简单,但是USB拓展就麻烦许多了,这里由于overlay的内存分配问题导致软件安装失败,这里找到了一种方法就是直接从uboot刷入南浦月大神的wr720n的openwrt固 ...

  4. jvm:内存结构(堆、方法区、程序计数器、本地方法栈、虚拟机栈)

    1.jvm内存结构 静态编译:把java源文件编译成字节码文件class,这个时候class文件以静态方式存在. 类加载器:把java字节码文件加载到内存中 方法区:将字节码放到方法区作为元数据(简单 ...

  5. ArrayList的传值问题

    ArrayList是一个对象类型,记录一下遇到的传值问题 假设两个ArrayList类型的值a和b,a有值,b无值,想把a的值全部复制给b. 如果使用 b = a; 进行赋值,会将a的地址赋值给b,当 ...

  6. HOOK相关原理与例子

    消息HOOK 原理: 1. 用户输入消息,消息被放到系统消息队列. 2. 程序发生了某些需要获取输入的事件,就从系统消息队列拿出消息放到程序消息队列中. 3. 应用程序检测到有新的消息进入到程序消息队 ...

  7. SuperMap许可常见问题及解决办法

    一.试用许可申请可以直接在北京超图软件股份有限公司官网的“SuperMap 技术资源中心”申请试用许可,申请后您将获得:1.如果申请的是 SuperMap GIS 7C 系列产品的许可,您将获得 一个 ...

  8. python pdb 转载:https://www.linuxidc.com/Linux/2017-11/148329.htm

    最近在为一个监控系统开发agent,需要支持Linux.FreeBSD及Windows等操作系统.复杂的线上环境,带来了一系列诡异的问题,尽管代码上线前在为数不少的测试机器验证过. Python程序吐 ...

  9. RabbitMQ 交换机类型

    1,扇形交换机 fanout 2, 直连交换机 direct 3, 通配符交换机 topic

  10. mongodb的更新语句

    MongoDB 使用 update() 和 save() 方法来更新集合中的文档: update()方法: update() 方法用于更新已存在的文档.语法格式如下: db.collection.up ...