tableView用法----博客状态案例
自定义微博步骤:
1.观察应用,分析功能,了解答题流程
2.加载plist取出数据,同时建立模型储存到数组中,因为这是个自定义cell,每个cell的高度都是由cell里面内容确定的,但是要设置cell的高度就要的hi用代理的的这个方法:
- (CGFloat)tableVIew:(UITableView *) heightForRowAtIndexPath:(NSIndexPath *)IndexPath
问题来了,我们要设置cell的内容就需要在创建cell的方法里将对象赋值过去,但是设置高度的方法是在创建cell方法之前调用的,这个时候我们还不知道cell的内容。怎么办?
其实我们写到后面就发现了,计算cell高度只需要plist里取出的数据就可以了,我们要加里一个Frame模型,用来记录各个控件的宽高,计算出cell的高度,在这个Frame模型里包含一个weibo的基础模型之后,我么就可以在之后的传值的时候传递这个Frame模型就可以了
/**
* 懒加载数据模型
*/
- (NSArray *)weibos
{
// 懒加载一定要判断防止重复加载
if (!_weibos) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"statuses.plist" ofType:nil];
NSArray *array = [NSArray arrayWithContentsOfFile:path];
// 数据转模型
NSMutableArray *modle = [NSMutableArray arrayWithCapacity:array.count];
for (NSDictionary *dict in array) {
LYweiboFrame *weiboFrame = [[LYweiboFrame alloc] init];
weiboFrame.weibo = [LYWeibo weiboWithDictionaty:dict];
[modle addObject:weiboFrame];
}
self.weibos = [modle copy];
}
return _weibos;
}
3.创建weibocellView
在这个cell初始化的时候,将需要的控件加上去,这里有需要注意的
自定义cellVIew里面使用的初始化方法是:init方法
如果是Xib创建的cell,那么初始化方法是:
initWithCoder:和:
awakeFromNib
这一点是需要注意的
4.现在什么都有了,就剩下填充数据了。在CellVIew里面写一个方法,将传过去模型的数据,填充到建立的各个控件里去就可以了。
上代码:
LYViewController.m
// // LYViewController.m // TG小项目 // // Created by liye on 14-5-28. // Copyright (c) 2014年 heima. All rights reserved. // #import "LYViewController.h" #import "LYTgModel.h" #import "LYCellView.h" #import "LYFooterView.h" #import "LYHeadderView.h" @interface LYViewController ()<UITableViewDataSource, LYFooterViewDelegate> /** * - tableView */ @property (weak, nonatomic) IBOutlet UITableView *tableView; /** * - 懒加载数组 */ @property (strong, nonatomic) NSMutableArray *tgs; @end @implementation LYViewController #pragma mark 代理方法 - (void)footViewLoadMoreBtn:(LYFooterView *)footerView { LYTgModel *newTg = [[LYTgModel alloc] init]; newTg.title = @"一家人快餐"; newTg.price = @"¥9.9"; newTg.buyCount = @"0"; // 添加数据 [self.tgs addObject:newTg]; // 刷新数据 [self.tableView reloadData]; } #pragma mark viewDidLoad - (void)viewDidLoad { [super viewDidLoad]; // 设置底部视图 LYFooterView *footerView = [LYFooterView footerView]; // 设置底部视图代理 footerView.delegate = self; self.tableView.tableFooterView = footerView; // 设置顶部视图 LYHeadderView *headderView = [LYHeadderView headderView]; self.tableView.tableHeaderView = headderView; } #pragma mark -tableView /** * tableView返回多少组 */ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } /** * 每组多少行 */ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.tgs.count; } /** * 每行的数据 */ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 创建cell LYCellView *cell = [LYCellView addCell:tableView]; // 设置cell cell.tg = self.tgs[indexPath.row]; // 返回cell return cell; } #pragma mark 去掉状态栏 - (BOOL)prefersStatusBarHidden { return YES; } #pragma mark -懒加载数据 - (NSArray *)tgs { // 懒加载一定要判断防止重复加载 if (!_tgs) { NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil]; NSArray *array = [NSArray arrayWithContentsOfFile:path]; // 数据转模型 NSMutableArray *modle = [NSMutableArray arrayWithCapacity:array.count]; for (NSDictionary *dict in array) { [modle addObject:[LYTgModel tgWithDictionaty:dict]]; } self.tgs = [modle mutableCopy]; } return _tgs; } @end
创建模型(先引入一个宏)
LYGolbal.h
// // LYGolbal.h // UITable练习 // // Created by liye on 14-5-27. // Copyright (c) 2014年 heima. All rights reserved. // #ifndef UITable___LYGolbal_h #define UITable___LYGolbal_h #define LYinitH(name) \ - (instancetype)initHeroWithDictionary:(NSDictionary *)dict;\ + (instancetype)name##WithDictionaty:(NSDictionary *)dict; #define LYinitM(name)\ - (instancetype)initHeroWithDictionary:(NSDictionary *)dict\ {\ if (self = [super init]) {\ [self setValuesForKeysWithDictionary:dict];\ }\ return self;\ }\ + (instancetype)name##WithDictionaty:(NSDictionary *)dict\ {\ return [[self alloc] initHeroWithDictionary:dict];\ } #endif
建立模型
#import <Foundation/Foundation.h> #import "LYGolbal.h" @interface LYTgModel : NSObject @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *buyCount; @property (nonatomic, copy) NSString *icon; @property (nonatomic, copy) NSString *price; LYinitH(tg); @end #import "LYTgModel.h" #import "LYGolbal.h" @implementation LYTgModel LYinitM(tg); @end
CellView:
#import <UIKit/UIKit.h> @class LYTgModel; @interface LYCellView : UITableViewCell @property (strong, nonatomic) LYTgModel *tg; + (instancetype)addCell:(UITableView *)tableView; @end #import "LYCellView.h" #import "LYTgModel.h" @interface LYCellView () @property (weak, nonatomic) IBOutlet UILabel *titleLabel; @property (weak, nonatomic) IBOutlet UILabel *priceLabel; @property (weak, nonatomic) IBOutlet UILabel *buyCount; @property (weak, nonatomic) IBOutlet UIImageView *cellImageView; @end @implementation LYCellView + (instancetype)addCell:(UITableView *)tableView { // cell标记 NSString *cellMark = @"tg"; // 从缓存中取出cell LYCellView *cell = [tableView dequeueReusableCellWithIdentifier:cellMark]; // 判断是否存在cell if (!cell) { cell = [[NSBundle mainBundle] loadNibNamed:@"LYCellView" owner:nil options:nil][0]; } return cell; } - (void)setTg:(LYTgModel *)tg { if (self) { self.cellImageView.image = [UIImage imageNamed:tg.icon]; self.titleLabel.text = tg.title; self.priceLabel.text = [NSString stringWithFormat:@"¥%@", tg.price]; self.buyCount.text = [NSString stringWithFormat:@"%@已购买", tg.buyCount]; } } @end
靠,xib文件怎么搞
算了,你们自己建把,这里需要一个LYCellView.xib
LYheadderView
#import <UIKit/UIKit.h> @interface LYHeadderView : UIView <UIScrollViewDelegate> + (LYHeadderView *)headderView; @end #define kImageCount 5 #define kWidth 300 #define kHeight 140 #import "LYHeadderView.h" @interface LYHeadderView () @property (weak, nonatomic) IBOutlet UIScrollView *headScrollView; @property (weak, nonatomic) IBOutlet UIPageControl *pageNumber; @property (strong, nonatomic) NSTimer *timer; @end @implementation LYHeadderView /** * 添加视图headderView */ + (LYHeadderView *)headderView { // 从Bundle中取出 NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"LYHeadderView" owner:nil options:nil]; return array[0]; } /** * 为视图添加数据 */ - (void)awakeFromNib { for (int i = 0; i < kImageCount; i ++) { UIImageView *headderImageView = [[UIImageView alloc] init]; headderImageView.frame = CGRectMake(i * kWidth, 0, kWidth, kHeight); NSString *imageName = [NSString stringWithFormat:@"ad_%02d", i]; headderImageView.image = [UIImage imageNamed:imageName]; [self.headScrollView addSubview:headderImageView]; } // 滚动效果 self.headScrollView.contentSize = CGSizeMake(kImageCount * kWidth, kHeight); // 取消垂直方向的滚动条 self.headScrollView.showsVerticalScrollIndicator = NO; // 半自动分页 self.headScrollView.pagingEnabled = YES; // 设置代理 self.headScrollView.delegate = self; // 自动播放 [self startTimer]; } #pragma mark 代理方法 - (void)nextImage { if (self.pageNumber.currentPage == kImageCount - 1) { self.pageNumber.currentPage = 0; }else{ self.pageNumber.currentPage ++; } CGFloat currentX = kWidth * (self.pageNumber.currentPage); [self.headScrollView setContentOffset:CGPointMake(currentX, 0) animated:YES]; } // 只要图片滚动,就会计算图片当前页数 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (!self.timer) { // 设置图片页数 CGFloat currentX = self.headScrollView.contentOffset.x; self.pageNumber.currentPage = (currentX + kWidth * 0.5) / kWidth; } } // 拖动时,关闭计时器 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self.timer invalidate]; self.timer = nil; } // 结束拖动,开始计时器 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [self startTimer]; } // 开启计时器方法 - (void)startTimer { self.timer = [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(nextImage) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } @end
这里需要一个LYHeadderView.xib
LYFooterView
#import <UIKit/UIKit.h> @class LYFooterView; @protocol LYFooterViewDelegate <NSObject> @optional - (void)footViewLoadMoreBtn:(LYFooterView *)footerView; @end @interface LYFooterView : UIView @property (strong, nonatomic) id<LYFooterViewDelegate> delegate; + (instancetype)footerView; @end #import "LYFooterView.h" @interface LYFooterView() @property (weak, nonatomic) IBOutlet UIButton *loadMoreBtn; @property (weak, nonatomic) IBOutlet UIView *hiddenView; @end @implementation LYFooterView + (instancetype)footerView { return [[NSBundle mainBundle] loadNibNamed:@"LYFooterView" owner:nil options:nil][0]; } /** * 按钮点击事件 */ - (IBAction)loadMoreBtnClick { NSLog(@"加一个"); // HiddenView显示,Button隐藏 self.hiddenView.hidden = NO; self.loadMoreBtn.hidden = YES; // 代理添加一条数据 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 使用代理 if ([self.delegate respondsToSelector:@selector(footViewLoadMoreBtn:)]) { [self.delegate footViewLoadMoreBtn:self]; } // HiddenView隐藏,Button显示 self.hiddenView.hidden = YES; self.loadMoreBtn.hidden = NO; }); } @end
小叶子是小白,只是在这里回顾一下流程,巩固知识