一个自定义cell的小例子
group-Control
//
//  ViewController.m
//  1105-cellxib
//
//  Created by 修修 on 15/11/5.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import "ViewController.h"
#import "SLTgModel.h"
#import "SLTgViewTableViewCell.h"
#import "SLFootView.h"@interface ViewController () <UITableViewDataSource, SLFootViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tableView;/***  保存模型数据的数组*/
@property (nonatomic, strong) NSMutableArray *tgModels;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// tableView每一行的高度self.tableView.rowHeight = 80;// 设置tableView底部的tableFooterView// 自定义一个xib文件,并为xib绑定自己的类,在自定义的类中读取xib并返回一个footview对象// 将这个对象赋值给tableFooterView// 由于要监听自定义footview的按钮事件,并让控制器加载新的数据,所以要自定义的类写一个自定义的代理// 并让控制器称为他的代理,来告诉控制器我什么时候点击按钮,并让控制器做些事情// 这就是一种代理设计模式SLFootView *footview = [SLFootView footview];footview.delegate = self;self.tableView.tableFooterView = footview;
}
/***  隐藏手机顶部的状态栏(运营商、电量...)**  @return yes:隐藏,no:不隐藏*/
-(BOOL)prefersStatusBarHidden
{return YES;
}
#pragma mark - getter方法的重写- (NSMutableArray *)tgModels
{// 懒加载:有值的时候就不再赋值直接返回,没有值的时候才进行赋值if (_tgModels == nil) {// 通过mainBundle拿到plist的全路径NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil];// 取得plist中的数组NSArray *tempTgs = [NSArray arrayWithContentsOfFile:path];// 定义一个可变数组,用来临时存储模型数据NSMutableArray *tempMTgs = [NSMutableArray array];// 遍历plist数组中的字典for ( NSDictionary *dict in tempTgs ){// 自定义一个模型类,将字典传入,得到相应的模型(实现了很好地封装性)SLTgModel *tgModel = [SLTgModel tgModelWithDict:dict];// 将模型加到之前的临时可变数组中[tempMTgs addObject:tgModel];}// 将临时数组赋给我们定义好的模型数组_tgModels = tempMTgs;}// 返回数组return _tgModels;
}#pragma mark - 数据源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{// 根据模型数组中元素的个数返回tableView的行数return self.tgModels.count;
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{// 生成cell// 我们通过xib自定义了一个cell,并让他写一个类SLTgViewTableViewCell,在这个类中管理我们自定义的cell// 控制器只要给我相应的tableView,我就给他返回一个我们自己写的cellSLTgViewTableViewCell *cell = [SLTgViewTableViewCell tgViewTableViewCell:tableView];// 给cell添加数据// 将模型传给我们的cell,在cell中重写模型的setter方法,并把模型的值赋给相应的控件cell.tgModel = self.tgModels[indexPath.row];// 返回cell,这个cell中的控件已经有了相应的值return cell;
}#pragma mark - footview的代理方法
// 当footview中的loadbtn发生点击事件的时候,控制器会自动调用这个方法
- (void)footviewDidClickedLoadBtn:(SLFootView *)footview
{// 真正的项目中,是从网络上获取数据,在这就模拟一下这个过程SLTgModel *tgModel = [[SLTgModel alloc] init];tgModel.icon = @"2010e3a0c7f88c3f5f5803bf66addd93";tgModel.title = @"金钱豹";tgModel.price = @"888";tgModel.buyCount = @"10000";[self.tgModels addObject:tgModel];[self.tableView reloadData];
}@end
group-View
//
//  SLTgViewTableViewCell.h
//  1105-cellxib
//
//  Created by 修修 on 15/11/5.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import <UIKit/UIKit.h>
@class SLTgModel;
@interface SLTgViewTableViewCell : UITableViewCell
/***  每个cell对应的模型*/
@property (nonatomic, strong) SLTgModel *tgModel;+ (instancetype)tgViewTableViewCell:(UITableView *)tableView;
@end
//
//  SLTgViewTableViewCell.m
//  1105-cellxib
//
//  Created by 修修 on 15/11/5.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import "SLTgViewTableViewCell.h"
#import "SLTgModel.h"
@interface SLTgViewTableViewCell ()
/***  店家图片*/
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
/***  购买数量*/
@property (weak, nonatomic) IBOutlet UILabel *buyCountLabel;
/***  商品价格*/
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
/***  店家名称*/
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;@end@implementation SLTgViewTableViewCell
// 重写模型的setter方法,并将模型的值赋给相对应的控件
- (void)setTgModel:(SLTgModel *)tgModel
{_tgModel = tgModel;self.iconView.image = [UIImage imageNamed:tgModel.icon];self.titleLabel.text = tgModel.title;self.priceLabel.text = [NSString stringWithFormat:@"¥%@", tgModel.price];self.buyCountLabel.text = [NSString stringWithFormat:@"%@人购买", tgModel.buyCount];
}
// 将我们生成cell的方法封装起来,只提供一个生成cell的方法
+ (instancetype)tgViewTableViewCell:(UITableView *)tableView
{// cell 的唯一标识NSString *ID = @"tg";// 在tableview的缓存池找对应ID的cellSLTgViewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (cell == nil) { // 没有对应的cell,就通过读取xib拿到我们的cellcell = [[[NSBundle mainBundle] loadNibNamed:@"SLTg" owner:nil options:nil] lastObject];}return cell;
}
@end
//
//  SLFootView.h
//  1105-cellxib
//
//  Created by 修修 on 15/11/6.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import <UIKit/UIKit.h>
@class SLFootView;
// SLFootView的代理协议
@protocol SLFootViewDelegate <NSObject>
// 下面的方法,代理是可以选择实现的
@optional
// 当SLFootView中的LoadBtn发生点击的时候,就会通知代理调用该方法
- (void)footviewDidClickedLoadBtn:(SLFootView *)footview;
@end@interface SLFootView : UIView
/***  外部用来初始化SLFootView的接口**  @return 放回相应的SLFootView对象*/
+ (instancetype)footview;
/***  SLFootView的代理,id<SLFootViewDelegate> :表示任何对象都可以成为我们的代理,但要遵守相应的协议*/
@property (nonatomic, strong) id<SLFootViewDelegate> delegate;
@end
//
//  SLFootView.m
//  1105-cellxib
//
//  Created by 修修 on 15/11/6.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import "SLFootView.h"@interface SLFootView ()
/***  加载更多按钮*/
@property (weak, nonatomic) IBOutlet UIButton *loadBtn;
/***  正在加载的时候要显示的view*/
@property (weak, nonatomic) IBOutlet UIView *loadingView;
/***  加载更多按钮的点击事件*/
- (IBAction)loadBtnClick;
@end@implementation SLFootView+ (instancetype)footview
{// 通过xib返回相应的footviewreturn [[[UINib nibWithNibName:@"SLFootView" bundle:nil] instantiateWithOwner:nil options:nil] lastObject];
}- (IBAction)loadBtnClick
{// 加载按钮隐藏,正在加载的view显示self.loadBtn.hidden = YES;self.loadingView.hidden = NO;// 一定的延迟(模拟网络加载用的那一段时间)delayInSeconds:几秒后,执行block中的代码dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{// 如果代理实现了相应的方法,就通知代理,并把自己传过去,告诉代理是谁发生了什么事if ([self.delegate respondsToSelector:@selector(footviewDidClickedLoadBtn:)]) {[self.delegate footviewDidClickedLoadBtn:self];}// 加载按钮显示,正在加载的view隐藏self.loadBtn.hidden = NO;self.loadingView.hidden = YES;});
}
@end
group-Model
<pre name="code" class="objc">//
//  SLTgModel.m
//  1105-cellxib
//
//  Created by 修修 on 15/11/5.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import "SLTgModel.h"@implementation SLTgModel- (instancetype)initWithDict:(NSDictionary *)dict
{if (self = [super init]) {// 通过KVC方式赋值[self setValuesForKeysWithDictionary:dict];}return self;
}+ (instancetype)tgModelWithDict:(NSDictionary *)dict
{return [[self alloc] initWithDict:dict];
}@end
//
//  SLTgModel.m
//  1105-cellxib
//
//  Created by 修修 on 15/11/5.
//  Copyright © 2015年 cn.Xsoft. All rights reserved.
//#import "SLTgModel.h"@implementation SLTgModel- (instancetype)initWithDict:(NSDictionary *)dict
{if (self = [super init]) {// 通过KVC方式赋值[self setValuesForKeysWithDictionary:dict];}return self;
}+ (instancetype)tgModelWithDict:(NSDictionary *)dict
{return [[self alloc] initWithDict:dict];
}@end

iOS学习08代码1相关推荐

  1. ios学习 准备列表

    2019独角兽企业重金招聘Python工程师标准>>> Skip to content This repository Pull requests Issues Gist Watch ...

  2. ios学习--iphone开发笔记和技巧总结(原址持续更新)

    ios学习--iphone开发笔记和技巧总结(原址持续更新) 分类: ios Object-C2012-04-18 10:16 2716人阅读 评论(1) 收藏 举报 uiviewiphonelist ...

  3. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  4. iOS学习——核心动画之Layer基础

    iOS学习--核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  5. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  6. iOS学习资源(一)

    用了印象笔记也很久了,这里就把自己整理的一些学习资源分享出来.需要共享印象笔记的小伙伴可以联系: shavekevin@gmail.com 我会把自己的工作笔记共享给大家,和大家一起学习,一起进步. ...

  7. 如何高效的学习TensorFlow代码?

    如何高效的学习TensorFlow代码? 如题,或者如何掌握TensorFlow,应用到任何领域? 添加评论分享 10 个回答 爱琳李,老李,明天就辍学了 8 人赞同 本来都忘了这个问题了,不过看到很 ...

  8. ios 学习常用网站

    一 ,别的blog上的内容 iPhone 4 与iPad开发基础教程 一.邮件列表: 1.cocoa-dev http://lists.apple.com/mailman/listinfo/cocoa ...

  9. iOS学习之iOS沙盒(sandbox)机制和文件操作(二)

    接上篇 iOS学习之iOS沙盒(sandbox)机制和文件操作(一) 我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的Home目录 [cpp] view plaincopy N ...

最新文章

  1. SpringBoot系列: Web应用鉴权思路
  2. android访问java服务器_Android_post访问java服务器端
  3. 服务器物理内存总是九十几,服务器物理内存使用率90以上
  4. 16 张图解带你掌握一致性哈希算法
  5. 很感谢你能来,不遗憾你离开(好文章)
  6. main(argc,argv[])
  7. IT基础架构变革,Hitachi Vantara如何解决超融合(HCI)的真正痛点?
  8. 【单片机】4.2 AT89S52中断系统结构
  9. 无法安装打印机,打印处理器不存在
  10. 简单粗暴,java pdf转word,word转图片,无水印,无大小限制
  11. 自学Java必备英语单词表
  12. 狄利克雷卷积_狄利克雷卷积莫比乌斯反演总结
  13. excel数据库_标签打印软件中Excel数据整理及导入
  14. JMF介绍之媒体框架
  15. python twisted教程_twisted基础教程.pdf
  16. 【PR 基础】PR界面简介
  17. java jni ocx_Java调用ocx控件以及dll
  18. JS——对已有元素内容进行筛选(本地搜索筛选)
  19. Ubuntu 18.04将语言改为中文(简体)
  20. 移动宽带GM220-S光猫桥接

热门文章

  1. PDF编辑管理工具Cisdem PDFMaster Mac
  2. 【读书笔记】c和指针
  3. 女生可以学Java开发吗?
  4. 电影《铃芽之旅》观后感
  5. 数组操作(栈方法、队列方法、重排序等)
  6. 韩国国会表决通过中韩自贸协定批准案
  7. CSP-J 2020 入门组/普及组
  8. 基于php新闻发布平台 毕业设计-附源码141646
  9. 云师大计算机考研考什么,云南师范大学研究生院,云师大考研复试好难啊。
  10. 华为路由器和交换机的简单命令